linuxpython調試
1. python 中如何優雅地調用並執行外部 Linux 命令
在Python中優雅地調用並執行外部Linux命令,首先可以通過os模塊下的system函數實現。然而,它的缺點是無法獲取執行命令的標准輸出、標准錯誤,僅能獲取執行命令的返回碼,當返回碼為0表示執行成功,非0表示執行錯誤。
為了更完善的執行Linux命令並獲取其輸出,推薦使用subprocess模塊。該模塊可以調用外部命令並執行外部程序,不僅能夠獲取執行命令的返回碼,還能獲取stdout和stderr的值,使調用過程更加全面和靈活。通過這種方式,用戶能更直觀地處理Linux命令的執行結果,實現Python與Linux命令之間的無縫對接。
2. 適用於 Linux 的最佳 Python IDE
適用於 Linux 的最佳 Python IDE 有多個選擇,以下是一些推薦:
Eric:
- 基於 Qt6的開源 Python 編輯器。
- 內置豐富的 Python 功能並支持插件擴展。
- 強大的調試器和互動式外殼,以及對 pip 的集成支持。
Geany:
- 輕巧且基於 GTK3,非常適合 Linux 系統。
- 支持多種編程語言,包括 Python,且可以通過插件系統進一步增強功能。
PyCharm:
- 專業級的 Python IDE,由 JetBrains 開發。
- 提供豐富的功能和廣泛的用戶基礎,特別針對 Python 量身定製。
Spyder:
- 專為科學計算而設計,擁有類似 MATLAB 的特性。
- 適合數據可視化和分析,科學工具豐富,功能類似 PyCharm 的付費版。
Thonny:
- 為初學者打造,基於 Tk GUI,簡潔易用。
- 是學習 Python 的理想起點。
Visual Studio Code:
- 微軟出品,支持多種編程語言。
- 通過插件可完美適用於 Python,提供流暢的用戶體驗。
Bluefish:
- 適合前端工程師和網頁設計師,雖然主要為編輯器。
- 但也支持 Python 語法高亮,可以作為輕量級的選擇。
總結:選擇哪個 IDE 取決於你的具體需求和項目類型。無論是初學者還是專業人士,上述 IDE 都有各自的優勢和特點,可以根據個人喜好和項目需求進行選擇。
3. 6 個最好的 Python IDE 和代碼編輯器 | Linux 中國
Python,作為現代編程語言的代表,廣泛應用於網站開發、應用程序構建、數據科學、人工智慧以及物聯網設備等領域。因此,選擇合適的開發環境對於Python開發者來說至關重要。本文將介紹六個適用於Linux和Windows操作系統的最佳Python代碼編輯器,旨在幫助開發者根據自己的需求和使用情況選擇最合適的工具。
1. **Visual Studio Code**
Visual Studio Code雖然由微軟開發,但因其強大的功能和跨語言支持而成為眾多開發者首選的代碼編輯器。它具備語法高亮、代碼補全、調試、代碼片段、內置Git等功能,對於Python開發尤其友好。雖然對於初學者可能略顯復雜,但只需幾小時的學習即可掌握其基本操作。Visual Studio Code支持Linux、macOS和Windows操作系統。
2. **Eclipse with PyDev插件**
Eclipse是由IBM開發的一款全面的集成開發環境(IDE),原主要用於Java和Android開發,但也能支持多種編程語言,包括Python。通過集成PyDev插件,Eclipse可成為完整的Python開發環境。用戶可享受編譯、代碼分析、實時調試、互動式控制台訪問等豐富功能。
3. **PyCharm**
由JetBrains開發的PyCharm,專為Python開發者設計,提供智能代碼補全、代碼檢查、即時錯誤高亮、快速修復等功能。它還集成了調試器、測試運行器、Python解析器、內置終端和版本控制系統集成等工具。PyCharm支持Python網頁開發,還提供對多種框架、語言的支持,適合科學和網頁開發。
4. **Spyder**
Spyder是一個專為科學家和數據科學家設計的強大Python編輯器,使用Python編寫。它集成了高級編輯、分析、調試和剖析功能,同時結合了科學軟體包的數據探索、互動式執行、深度檢查和可視化功能。適用於科學計算和數據科學項目。
5. **Sublime Text**
Sublime Text是一個功能強大的代碼編輯器,支持Python編程,適用於跨平台使用。它提供了如「Goto anywhere」等提高生產力的功能,支持許多編程語言,並允許用戶通過插件擴展其功能。
6. **Thonny Python編輯器**
Thonny是一個面向初學者的Python IDE,設計簡潔,易於上手。它內置了最新的Python版本,並提供了基本的開發工具,如變數視圖、調試器和語法錯誤處理。適合Python新手使用。
除上述編輯器外,還有如VIM、IDLE、Cloud 9和Emacs等值得關注的Python編輯器。本文提供了一個全面的概覽,幫助開發者根據自己的需求和經驗選擇最適合的工具。
4. 實戰操作——在Linux環境上運行/調試Python代碼
在Linux環境下搭建Miniconda並運行/調試Python代碼,實現高效編程環境搭建與遠程伺服器協同工作,以下為具體步驟:
一、環境准備:在Linux上搭建Miniconda
1、Miniconda介紹:Miniconda是一個輕量級、免費且開源的跨平台軟體包管理系統,適合創建並管理多個Python環境。推薦使用Miniconda搭建穩定且高效的Python工作環境。
2、下載並安裝Miniconda:通過shell工具連接伺服器,進入下載目錄,執行命令下載Miniconda並按照提示完成安裝。確保將conda添加至用戶環境變數。
3、配置鏡像源與使用Miniconda:配置國內鏡像源加速包下載速度,修改~/.condarc文件添加清華源。查看conda配置並了解常用命令。
4、使用Mamba加速conda:Mamba是Conda的加速實現,提高執行速度。安裝Mamba後,替換conda命令在base環境中的包在小環境中依然可用。
二、Pycharm遠程調試與debug
1、配置遠程伺服器:在Pycharm中,通過Tools->Deployment->Configuration添加新環境,填寫完整信息,設置項目映射地址,確保相對路徑指向項目層級。開啟自動同步並手動同步至伺服器。
2、配置遠程解釋器用於debug:選擇項目解釋器,添加遠程解釋器,創建遠程環境。編寫並運行測試文件,確保其自動同步至伺服器執行。通過遠端SSH連接伺服器進行調試。
5. 如何使用Python動態控制Linux系統的內存佔用百分比
如何使用Python動態控制Linux系統的內存佔用百分比?
近期有網上朋友尋求幫助:如何通過腳本動態控制Linux系統的內存佔用百分比?經過一番網路+編寫調試,終於初步完成了動態控制Linux系統內存佔用百分比。現寫出來以幫助更多的朋友。
1 前言
根據需求是動態控制Linux系統內存佔用百分比,比如當前內存佔用30%,如果設置內存佔用為70%,則需要申請內存使達到佔用70%;如果再降低到40%,則需要釋放部分申請的內存。其實腳本的本質是內存動態申請與釋放。
注意:因為Python腳本運行之前內存有一定佔用,故設定內存佔用不能低於該百分比。
2 內存動態申請
通過查詢資料,使用Python動態申請內存塊,可以使用ctypes包中的函數,導入包及代碼如下所示:
>>> from ctypes import *
>>> mem=create_string_buffer(1024)
說明:內存申請使用create_string_buffer()函數,上面申請了1024位元組的內存塊。
下面演示申請100MB內存前後變化
申請前如下圖所示:
使用代碼如下:
>>>mem=create_string_buffer(104857600)
申請後如下圖所示:
從上述兩幅圖中可以看出,申請內存前內存佔用295MB,申請後內存佔用397MB,增加了約100MB內存佔用。
3 內存動態釋放
由於Python對內存是有垃圾回收機制的,採用對象引用計數方式。當對象的引用計數為0時,啟動垃圾回收GC。此處內存動態釋放就是使用該原理。
代碼如下:
>>> mem=None
釋放後內存佔用如下圖所示:
內存佔用由397MB降低到297MB,釋放了100MB內存佔用。
說明:將None賦值給對象mem後,mem對象的引用計數即為0,此時垃圾回收啟動,釋放mem對象佔用的內存。
4 系統總內存、佔用內存檢測
由於需要設定內存佔用百分比,故需要獲取系統總物理內存和佔用內存。本文使用的方法是讀取系統文件「/proc/meminfo」,從中解析出總內存大小以及當前內存佔用大小等內存相關的信息。該文件內容格式如下圖所示:
代碼片段如下所示:
f = open("/proc/meminfo")
lines = f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name = line.split(':')[0]
var = line.split(':')[1].split()[0]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
說明:按行讀取meminfo文件內容,創建字典對象mem,將meminfo文件第一列設置為mem對象的鍵值,將meminfo文件第二列數字設置為mem對象的值。
5 獲取用戶輸入百分比
通過讀取鍵盤輸入字元串,然後轉換為數字實現接收用戶輸入的百分比,代碼如下所示:
input_str=raw_input("Input UsedMemory`s Rate or q to exit:")
rate=float(input_str)
注意:此處鍵盤輸入的都是字元串,需要進行字元串轉換為數字,使用float()或long()函數進行轉換。
6 動態設置內存佔用百分比測試
測試使用兩個Python腳本文件,分別是test.py和mem_rate.py,其功能分別是查看當前內存佔用和動態設定內存佔用百分比。如下圖所示:
注意:上述兩個文件需要使用「chmod +x *.py」修改為可執行屬性。
6.1 查看當前內存佔用
查看當前內存佔用百分比,使用上述test.py文件,運行命令為「./test.py」,運行結果如下圖所示:
當前使用內存為320MB,佔用百分比為17%。
6.2 動態設置內存佔用百分比
動態設置內存佔用百分比使用上述mem_rate.py腳本,注意該腳本文件第一行代碼為「#!/usr/bin/python2.6」,表示該腳本使用python2.6程序運行。該行需要修改為待運行Linux系統中Python實際的安裝程序路徑。
動態內存百分比設置界面如下圖所示:
處於待輸入狀態。另外顯示了當前內存佔用(321MB),總內存大小(1869MB)以及內存佔用百分比(17%)。
如果此時設置內存佔用百分比為80%,則腳本會每次申請10MB空間,直至內存佔用接近或等於80%為止。如下圖所示:
內存申請過程如下圖所示:
內存申請過程中佔用百分比變化為:35%,45%,56%,70%,…
mem_rate.py運行過程如下圖所示:
內存申請過程中佔用變化為:1461MB,1471MB,1481MB,1491MB。
此時如果內存佔用百分比設置為20%,則需要釋放一部分內存。
test.py腳本運行過程如下圖所示:
由於釋放內存運行較快,抓取到最後結果
內存佔用為20%。
mem_rate.py腳本運行過程如下圖所示:
內存釋放過程中內存佔用為:413MB,403MB,393MB,383MB,最後內存佔用穩定在20%,383MB。
輸入「q」或「Q」退出內存佔用百分比設定過程,如下圖所示:
此時內存佔用如下圖所示:
內存佔用恢復到運行mem_rate.py腳本之前狀態,17%,321MB。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
附:完整Python腳本代碼
test.py
------------------------------------------------------------------------------------------------
#!/usr/bin/python2.6
def memory_stat():
mem = {}
f = open("/proc/meminfo")
lines = f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name = line.split(':')[0]
var = line.split(':')[1].split()[0]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
# - mem['Buffers']- mem['Cached']
return mem
mem=memory_stat()
print("Used(MB):%d"%(long(mem['MemUsed'])/1024/1024))
print("Rate:%d%%"%(100*long(mem['MemUsed'])/float(mem['MemTotal'])))
§§§§§§§§§§§§§§§§§§§§§§§§§§
mem_rate.py
---------------------------------------------------
#!/usr/bin/python2.6
from ctypes import *
# Get Memory Info(Total, Used... Byte)
def get_memory_stat():
mem = {}
f = open("/proc/meminfo")
lines = f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name = line.split(':')[0]
var = line.split(':')[1].split()[0]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
# Return MemroyInfo Object
return mem
# Get Simple Memory Info
def get_memory_info(mem):
# Byte -> MB
n=1024* 1024
used=float(mem['MemUsed'])/ n
total=float(mem['MemTotal'])/ n
rate=used/total* 100
smp={'used':used,'total':total,'rate':rate}
return smp
# Display Current Memory Info
def print_memory_info(mem):
# Get SimpleMemory Info
smp=get_memory_info(mem)
print("Used(MB):%d\tTotal(MB):%d\tUsedRate:%d%%"%(smp['used'], smp['total'], smp['rate']))
# Get Rate Of Memory Used To Be Setted(Integer Formate)
def input_memory_used_rate(org_rate):
# Byte -> MB
n=1024* 1024
while(True):
mem=get_memory_stat()
print_memory_info(mem)
input_str=raw_input("Input UsedMemory`s Rate or q to exit:")
if(len(input_str)== 0):
continue
if("q"== input_str):
info={'rate':0,'used':mem['MemUsed']/ n}
return info
if("Q"== input_str):
info={'rate':0,'used':mem['MemUsed']/ n}
return info
try:
rate=float(input_str)
if((rate>=org_rate)and (rate<=95)):
info={'rate':rate,'used':mem['MemUsed']/ n}
return info
else:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))
except:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))
# Set Rate Of Memory Used
def set_memory_used_rate(new_rate, total, pre_used,list):
if(new_rate==0):
return None
dest_mem=total* new_rate /100.0
# 10MB
mb10=10485760
n_chg=10
# Free Memory OrAllocate Memory ?
is_new=dest_mem>pre_used
cur_used=pre_used
while(True):
# To Calc FreeMemory Or Allocate Memory ?
need_new=dest_mem-n_chg>=pre_used
need_del=dest_mem+n_chg<=pre_used
# Need To AllocateMemory
if(is_new):
if(need_new):
p=create_string_buffer(mb10)
list.append(p)
dest_mem=dest_mem-n_chg
cur_used=cur_used+n_chg
else:
return"end"
# Need To FreeMemory
else:
idx=len(list)-1
if(need_deland (idx>=0)):
p=list[idx]
del list[idx]
p=None
dest_mem=dest_mem+n_chg
cur_used=cur_used-n_chg
else:
return"end"
print("****** MemoryUsed(MB):%d"%(cur_used))
# Entry Of Program
# List Of Memory Object, 10MB Of One Object
list=[]
# Get Current Memory Info
mem=get_memory_stat()
# Get Simple Memory Info
smp=get_memory_info(mem)
org_rate=smp['rate']
total=smp['total']
while(True):
# Get Rate OfMemory To Be Used
info=input_memory_used_rate(org_rate)
new_rate=float(info['rate'])
pre_used=float(info['used'])
# Set Rate OfMemory To Be Used
rtn=set_memory_used_rate(new_rate, total, pre_used, list)
if(not rtn):
print("bye!")
exit()