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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python中判斷subprocess調(diào)起的shell命令是否結(jié)束

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

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

環(huán)境

Python:2.7.10

庫(kù):subprocess, logging

問題

使用subprocess的Popen類來執(zhí)行shell命令,要怎么樣才能知道命令執(zhí)行結(jié)束了,以此來執(zhí)行回調(diào)方法。

解決辦法

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

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

1. 當(dāng)命令未運(yùn)行結(jié)束的時(shí)候,返回None   

2. 當(dāng)命令結(jié)束時(shí),返回命令的返回值

演示

這里使用logging模塊來輔助顯示命令執(zhí)行時(shí)間

Python中判斷subprocess調(diào)起的shell命令是否結(jié)束

分別使用兩種調(diào)用shell命令的方式來測(cè)試

shell=True

Python中判斷subprocess調(diào)起的shell命令是否結(jié)束

shell=False

Python中判斷subprocess調(diào)起的shell命令是否結(jié)束

完整演示

Python中判斷subprocess調(diào)起的shell命令是否結(jié)束

補(bǔ)充:system函數(shù)返回(如何判斷調(diào)用的shell命令是否執(zhí)行成功)

例:

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

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

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

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

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

都錯(cuò)!

3、man中對(duì)于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函數(shù)對(duì)返回值的處理,涉及3個(gè)階段:

階段1:創(chuàng)建子進(jìn)程等準(zhǔn)備工作。如果失敗,返回-1。

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

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

備注1:

只要能夠調(diào)用到/bin/sh,并且執(zhí)行shell過程中沒有被其他信號(hào)異常中斷,都算正常結(jié)束。

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

如果shell腳本執(zhí)行過程中被強(qiáng)制kill掉等情況則算異常結(jié)束。

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

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

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

所以綜上,判斷一個(gè)system函數(shù)調(diào)用shell腳本是否正常結(jié)束的方法應(yīng)該是如下3個(gè)條件同時(shí)成立:

(1)-1 != status

(2)WIFEXITED(status)為真

(3)0 == WEXITSTATUS(status)

注意:

根據(jù)以上分析,當(dāng)shell腳本不存在、沒有執(zhí)行權(quán)限等場(chǎng)景下時(shí),以上前2個(gè)條件仍會(huì)成立,此時(shí)WEXITSTATUS(status)為127,126等數(shù)值。

所以,我們?cè)趕hell腳本中不能將127,126等數(shù)值定義為返回值,否則無法區(qū)分中是shell的返回值,還是調(diào)用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。

判斷shell腳本正常執(zhí)行結(jié)束的健全代碼如下:

#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; }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 视频一区在线免费观看 | 91香蕉视频免费 | 黄色网址网站 | 国产高清自拍视频 | 美国一级免费 | 久草网在线观看 | 最新欧美一级视频 | 一本色道久久88亚洲综合 | 欧美精品一区二区在线观看播放 | 99久久伊人一区二区yy5099 | 成年人免费在线视频 | 国产精自产拍久久久久久蜜 | 日本久草网 | 99久热在线精品视频观看 | 国产精品高清一区二区 | 欧美成人毛片在线视频 | 最新国产精品好看的国产精品 | 欧美日韩永久久一区二区三区 | 日韩性大片免费 | 欧美自拍在线 | 99成人在线观看 | 女同日韩互慰互摸在线观看 | www.91成人| 欧美videos极品 | 欧美自拍另类 | 欧美多人三级级视频播放 | 亚洲欧洲日产国码二区首页 | 成人毛片网 | 久久88香港三级 | 国产97公开成人免费视频 | 在线亚洲v日韩v | 欧美在线一级毛片观看 | 日本成人免费在线 | 亚洲制服丝袜美腿亚洲一区 | 亚洲成人福利在线 | 亚洲清纯自偷自拍另类专区 | 草久在线播放 | 久久国产亚洲 | 亚洲精品日韩中文字幕久久久 | 26uuu天天夜夜综合 | 99re热视频 |