下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Python中判斷subprocess調起的shell命令是否結束最近在使用subprocess遇到個問題,折騰了好半天才找到簡單的解決辦法,在這里記錄下。
Python:2.7.10
庫:subprocess,logging
使用subprocess的Popen類來執(zhí)行shell命令,要怎么樣才能知道命令執(zhí)行結束了,以此來執(zhí)行回調方法。
使用subprocess.Popen.poll方法來獲取命令的執(zhí)行情況。
poll方法的返回值有兩種情況
1.當命令未運行結束的時候,返回None
2.當命令結束時,返回命令的返回值
這里使用logging模塊來輔助顯示命令執(zhí)行時間
分別使用兩種調用shell命令的方式來測試
shell=True
shell=False
補充:system函數(shù)返回(如何判斷調用的shell命令是否執(zhí)行成功)
例:
status=system("./test.sh");
1、先統(tǒng)一兩個說法:
(1)system返回值:指調用system函數(shù)后的返回值,比如上例中status為system返回值
(2)shell返回值:指system所調用的shell命令的返回值,比如上例中,test.sh中返回的值為shell返回值。
2、如何正確判斷test.sh是否正確執(zhí)行?
僅判斷status是否==0?或者僅判斷status是否!=-1
都錯!
3、man中對于system的說明
RETURNVALUE
Thevaluereturnedis-1onerror(e.g.fork()failed),andthereturn
statusofthecommandotherwise.Thislatterreturnstatusisinthe
formatspecifiedinwait(2).Thus,theexitcodeofthecommandwill
beWEXITSTATUS(status).Incase/bin/shcouldnotbeexecuted,the
exitstatuswillbethatofacommandthatdoesexit(127).
看得很暈吧?
system函數(shù)對返回值的處理,涉及3個階段:
階段1:創(chuàng)建子進程等準備工作。如果失敗,返回-1。
階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執(zhí)行結束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說明了會寫了127這個值,但實測發(fā)現(xiàn)還會寫126等值。
階段3:如果shell腳本正常執(zhí)行結束,將shell返回值填到status的低8~15比特位中。
備注1:
只要能夠調用到/bin/sh,并且執(zhí)行shell過程中沒有被其他信號異常中斷,都算正常結束。
比如:不管shell腳本中返回什么原因值,是0還是非0,都算正常執(zhí)行結束。即使shell腳本不存在或沒有執(zhí)行權限,也都算正常執(zhí)行結束。
如果shell腳本執(zhí)行過程中被強制kill掉等情況則算異常結束。
如何判斷階段2中,shell腳本是否正常執(zhí)行結束呢?系統(tǒng)提供了宏:WIFEXITED(status)。如果WIFEXITED(status)為真,則說明正常結束。
如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現(xiàn),但安全的做法是使用系統(tǒng)提供的宏:WEXITSTATUS(status)。
由于我們一般在shell腳本中會通過返回值判斷本腳本是否正常執(zhí)行,如果成功返回0,失敗返回正數(shù)。
所以綜上,判斷一個system函數(shù)調用shell腳本是否正常結束的方法應該是如下3個條件同時成立:
(1)-1!=status
(2)WIFEXITED(status)為真
(3)0==WEXITSTATUS(status)
注意:
根據(jù)以上分析,當shell腳本不存在、沒有執(zhí)行權限等場景下時,以上前2個條件仍會成立,此時WEXITSTATUS(status)為127,126等數(shù)值。
所以,我們在shell腳本中不能將127,126等數(shù)值定義為返回值,否則無法區(qū)分中是shell的返回值,還是調用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。
判斷shell腳本正常執(zhí)行結束的健全代碼如下:
#includestdio.h
#includestdlib.h
intmain()
pid_tstatus;
status=system("./test.sh");
if(status==-1)
printf("systemerror...\n");
else
if(WIFEXITED(status))
if(0==WEXITSTATUS(status))
printf("runsuccessfully...\n");
else
printf("runfailed%d\n",WEXITSTATUS(status));
els
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金屬鉻還原工操作規(guī)程能力考核試卷含答案
- 拍賣運營師崗前工藝控制考核試卷含答案
- 飛機雷達安裝調試工變更管理競賽考核試卷含答案
- 鍛件切邊工道德強化考核試卷含答案
- 圓機操作工安全綜合評優(yōu)考核試卷含答案
- 自來水生產工崗前理論水平考核試卷含答案
- 冷鏈物流員安全素養(yǎng)知識考核試卷含答案
- 化學農藥生產工誠信品質能力考核試卷含答案
- 塑料熱合工安全意識競賽考核試卷含答案
- 礦山安全設備監(jiān)測檢修工安全知識宣貫模擬考核試卷含答案
- GB/T 38235-2025工程用鋼絲環(huán)形網(wǎng)
- 西醫(yī)基礎知識培訓課件
- 《電磁發(fā)射滅火炮技術規(guī)范》
- 風機攀爬安全培訓課件
- 陜西西安遠東二中學2026屆九年級數(shù)學第一學期期末考試模擬試題含解析
- 以人工智能賦能新質生產力發(fā)展
- 資產管理部2025年工作總結與2025年工作計劃
- 公建工程交付指南(第四冊)
- 2025年貴州省法院書記員招聘筆試題庫附答案
- 過氧化氫氣體低溫等離子滅菌測試題(附答案)
- 溶出度概況及注意事項很全面的一套資料2講課文檔
評論
0/150
提交評論