国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Python中判斷subprocess調起的shell命令是否結束

瀏覽:3日期:2022-06-21 15:05:37
前言

最近在使用subprocess遇到個問題,折騰了好半天才找到簡單的解決辦法,在這里記錄下。

環境

Python:2.7.10

庫:subprocess, logging

問題

使用subprocess的Popen類來執行shell命令,要怎么樣才能知道命令執行結束了,以此來執行回調方法。

解決辦法

使用subprocess.Popen.poll方法來獲取命令的執行情況。

poll方法的返回值有兩種情況   

1. 當命令未運行結束的時候,返回None   

2. 當命令結束時,返回命令的返回值

演示

這里使用logging模塊來輔助顯示命令執行時間

Python中判斷subprocess調起的shell命令是否結束

分別使用兩種調用shell命令的方式來測試

shell=True

Python中判斷subprocess調起的shell命令是否結束

shell=False

Python中判斷subprocess調起的shell命令是否結束

完整演示

Python中判斷subprocess調起的shell命令是否結束

補充:system函數返回(如何判斷調用的shell命令是否執行成功)

例:

status = system('./test.sh');1、先統一兩個說法:

(1)system返回值:指調用system函數后的返回值,比如上例中status為system返回值

(2)shell返回值:指system所調用的shell命令的返回值,比如上例中,test.sh中返回的值為shell返回值。

2、如何正確判斷test.sh是否正確執行?

僅判斷status是否==0?或者僅判斷status是否!=-1?

都錯!

3、man中對于system的說明

RETURN VALUE

The value returned is -1 on error (e.g. fork() failed), and the return

status of the command otherwise. This latter return status is in the

format specified in wait(2). Thus, the exit code of the command will

be WEXITSTATUS(status). In case /bin/sh could not be executed, the

exit status will be that of a command that does exit(127).

看得很暈吧?

system函數對返回值的處理,涉及3個階段:

階段1:創建子進程等準備工作。如果失敗,返回-1。

階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執行結束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說明了會寫了127這個值,但實測發現還會寫126等值。

階段3:如果shell腳本正常執行結束,將shell返回值填到status的低8~15比特位中。

備注1:

只要能夠調用到/bin/sh,并且執行shell過程中沒有被其他信號異常中斷,都算正常結束。

比如:不管shell腳本中返回什么原因值,是0還是非0,都算正常執行結束。即使shell腳本不存在或沒有執行權限,也都算正常執行結束。

如果shell腳本執行過程中被強制kill掉等情況則算異常結束。

如何判斷階段2中,shell腳本是否正常執行結束呢?系統提供了宏:WIFEXITED(status)。如果WIFEXITED(status)為真,則說明正常結束。

如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現,但安全的做法是使用系統提供的宏:WEXITSTATUS(status)。

由于我們一般在shell腳本中會通過返回值判斷本腳本是否正常執行,如果成功返回0,失敗返回正數。

所以綜上,判斷一個system函數調用shell腳本是否正常結束的方法應該是如下3個條件同時成立:

(1)-1 != status

(2)WIFEXITED(status)為真

(3)0 == WEXITSTATUS(status)

注意:

根據以上分析,當shell腳本不存在、沒有執行權限等場景下時,以上前2個條件仍會成立,此時WEXITSTATUS(status)為127,126等數值。

所以,我們在shell腳本中不能將127,126等數值定義為返回值,否則無法區分中是shell的返回值,還是調用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。

判斷shell腳本正常執行結束的健全代碼如下:

#include <stdio.h>#include <stdlib.h> int main() { pid_t status; status = system('./test.sh'); if(status == -1) { printf('system error... n'); } else { if(WIFEXITED(status)) {if(0 == WEXITSTATUS(status)) { printf('run successfully... n');} else { printf('run failed %d n',WEXITSTATUS(status)); } } else {printf('exit code %d n',WEXITSTATUS(status)); } } return 0; }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 欧美成人伊人十综合色 | 国产91精品久久久久999 | 在线a毛片免费视频观看 | 大陆孕妇孕交视频自拍 | 国产成人综合洲欧美在线 | 成人免费视频网 | 亚洲一区二区三区四区在线 | 亚洲欧美一区二区视频 | 欧美国产视频 | 在线成人精品国产区免费 | 欧美成人手机在线 | 日本亚洲国产 | 欧美成人观看 | 成年男女男精品免费视频网站 | 亚洲免费观看视频 | 国产欧美17694免费观看视频 | 波多野结衣视频在线 | 一级待一黄aaa大片在线还看 | 7ass欧美| 日韩精品中文字幕一区二区三区 | 国产欧美二区三区 | 国产美女在线一区二区三区 | 操哭美女 | 欧美videofree性欧美另类 | 国产高清国产专区国产精品 | 韩国毛片 免费 | 久草免费资源视频 | 亚洲国产精品一区二区不卡 | 成人a毛片在线看免费全部播放 | 国产精品成人久久久久久久 | 成熟的女性强烈交性视频 | 欧美成人手机视频免费播放 | 亚洲一级高清在线中文字幕 | 久草中文在线视频 | 国产免费一区二区三区在线 | 亚洲欧美自拍偷拍 | 国产精彩视频在线观看 | 日本高清视频在线观看 | 国产最猛性xxxxxx69交 | 日本欧美一区二区三区不卡视频 | 久草在线新首页 |