今天在做把Shell腳本翻譯成Python腳本的日常,對于Shell中$?
的用法引伸出一個問題麦锯,就是在Python腳本中如何讀取上一步運行進程的exit code肄渗,也看到有作status code或return code的叫法帽撑,經(jīng)過我的理解覺得是一個東西。簡單地說夷磕,TA就是C語言中main函數(shù)的return值(類型為int)履肃。
先請看Shell腳本偽代碼:
function show_exitcode {
./one_application $1 $2
if [[ $? -ne 0 ]]; then
echo "One Application Error."
}
關(guān)于$?的用法,可參考閱讀文章《Shell腳本中$0坐桩、$?尺棋、$!、$$绵跷、$*膘螟、$#、$@等的意義以及l(fā)inux命令執(zhí)行返回值代表意義》碾局。
那么問題來了荆残,這段Shell腳本函數(shù),如何用Python表達呢:
def show_exit_code(*args):
from subprocess import Popen
p_handler = Popen(
"./one_application {} {}".format(args[0], args[1]),
shell=True
)
p_handler.wait()
if '0' != p_handler.returncode:
print("One Application Error.")
說到subprocess
模塊净当,經(jīng)常使用Python開發(fā)運行腳本的朋友們會相對熟悉一些内斯。TA的作用就是通過Shell命令,運行一個第三方程序或第三方腳本像啼,通過創(chuàng)建Popen
的實例化對象俘闯,并將其實例化對象視作為操作這個第三方程序或者腳本的句柄對象。
PS:實際上忽冻,除了
Popen
之外真朗,上古操作之一,os.system()
的返回值就是exit code(類型int
)僧诚,就趨勢而言遮婶,Pythonista們更傾向于享用subprocess對os庫中系統(tǒng)操作的完善而帶來的便利。當(dāng)然湖笨,這也是個人習(xí)慣使然旗扑。
理解了這一層的操作,我們還有一個升級版的玩法赶么,在Python腳本內(nèi)部通過內(nèi)建多進程庫multiprocessing
創(chuàng)建的子進程肩豁,可否讀到exit code呢?Sure!
#!/usr/bin/env python3
from multiprocessing import Process
def exit_func():
print('Error 233')
exit(233)
if __name__ =='__main__':
p_handler = Process(target=exit_func)
p_handler.start()
p_handler.join()
print(p_handler.exitcode) # 結(jié)果:233
總結(jié):
1)使用subprocess
庫調(diào)用的第三方程序或腳本子進程清钥,可以讀取Popen
實例對象的returncode
屬性琼锋,即exit code;
2)使用multiprocessing
庫創(chuàng)建的子進程祟昭,可以讀取Process
實例對象的exitcode
屬性缕坎,即exit code;
3)目前為止篡悟,發(fā)現(xiàn)Python完全可以替代shell腳本實現(xiàn)功能谜叹,不同意者歡迎留言扔磚。
感謝您的支持和打賞 (= ̄ω ̄=) -->
BuyMeACoffee(Paypal)
如果喜歡這篇文章搬葬,記得收藏和點 ? 噢 ~ ~