Python中判斷subprocess調起的shell命令是否結束_第1頁
Python中判斷subprocess調起的shell命令是否結束_第2頁
Python中判斷subprocess調起的shell命令是否結束_第3頁
Python中判斷subprocess調起的shell命令是否結束_第4頁
Python中判斷subprocess調起的shell命令是否結束_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論