Python代碼調(diào)用執(zhí)行shell踩坑解決
背景
在老家 2 天,花了點時間,折騰了下 python 代碼,之前一直遇到個偶現(xiàn)點問題,這兩天總算解決了。
問題的核心是,你知道怎么正確用 python 代碼調(diào)用 linux 上的 shell 命令。
這里回涉及 2 個問題。
- 1、如何執(zhí)行本機(jī)上的 linux 命令?
- 2、如何執(zhí)行遠(yuǎn)程機(jī)器上的 linux 命令?
問題一:
可以執(zhí)行本機(jī) shell 命令的相關(guān) python 模塊和函數(shù)有好幾個,不過有一些已經(jīng)被廢棄或移除。
subprocess 模塊用于創(chuàng)建子進(jìn)程, 這個模塊用于替換舊版本中的一些模塊, 如:os.system,
os.spawn*, os.popen*, os.popen*, popen2., commands., subprocess 允許你能創(chuàng)建很多子進(jìn)程, 創(chuàng)建的時候能能指定子進(jìn)程和子進(jìn)程的輸入、輸出、錯誤輸出管道, 執(zhí)行后能獲取輸出結(jié)果和執(zhí)行狀態(tài)。
在 python3.5 之后的版本中, 官方文檔中提倡通過 subprocess.run() 函數(shù)替代其他函數(shù)來使用 subprocess 模塊的功能。
測試:自己寫了個簡單的 demo,驗證了 subprocess 調(diào)用 run 函數(shù)執(zhí)行 linux 命令的時候是阻塞的,一直會等到命令執(zhí)行完,再往下走。
另外,可以根據(jù)結(jié)果的 returncode 碼,進(jìn)行判斷,linux 命令有沒有執(zhí)行成功。



問題二:
關(guān)于 python 遠(yuǎn)程執(zhí)行 Linux,用的最多的還是 paramiko 模塊,我之前也是用了這個模塊,但是踩坑了。
核心主要代碼
sshclient = paramiko.SSHClient()
sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshclient.connect(ip, int(port), user, pwd, timeout=60)
check_in, check_out, check_err = sshclient.exec_command(self.check_slave_cmd)
坑就是,exec_command 函數(shù)是非阻塞的,不管命令有沒有執(zhí)行成功,python 代碼就往下走了。所以,有時候回出現(xiàn)偶像的 bug,因為取決于命令執(zhí)行的快慢和網(wǎng)速,譬如,假設(shè)你執(zhí)行的 shell 命令耗時比較久,而代碼已經(jīng)執(zhí)行到下面,發(fā)現(xiàn)沒有你 shell 命令的結(jié)果就報錯了。
解決方法
檢測一下該 shell 命令的執(zhí)行狀態(tài)。調(diào)用 recv_exit_status(),該函數(shù)回一直阻塞中,直到 shell 命令結(jié)束,一般正常接受的 status 是 0.。
所以,當(dāng)你要用到這個 paramiko 模塊執(zhí)行遠(yuǎn)程機(jī)器的 shell 命令的話,要多個心眼,保證 shell 命令有沒有執(zhí)行完成,會不會影響你的代碼。
以上就是Python 代碼調(diào)用執(zhí)行 shell,踩過的坑的詳細(xì)內(nèi)容,更多關(guān)于Python調(diào)用執(zhí)行shell踩坑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3.6之xlwt如何設(shè)置單元格對齊方式
這篇文章主要介紹了python3.6之xlwt如何設(shè)置單元格對齊方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Pytorch從0實現(xiàn)Transformer的實踐
本文主要介紹了Pytorch從0實現(xiàn)Transformer的實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
python中用shutil.move移動文件或目錄的方法實例
在python操作中大家對os,shutil,sys,等通用庫一定不陌生,下面這篇文章主要給大家介紹了關(guān)于python中用shutil.move移動文件或目錄的相關(guān)資料,需要的朋友可以參考下2022-12-12
Python虛擬環(huán)境virtualenv創(chuàng)建及使用過程圖解
這篇文章主要介紹了Python虛擬環(huán)境virtualenv創(chuàng)建及使用過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12
pip更新問題的解決:'python -m pip install -
這篇文章主要介紹了pip更新問題的解決:'python -m pip install --upgrade pip' 報錯問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04

