我有一個 python 程式,它使用 呼叫另一個 python 程式subprocess.run
,被呼叫的 python 程式依次呼叫一個可執行檔案subprocess.run
。
按照一個簡單的例子
一個.py
#!/usr/bin/env python3
import subprocess
res = subprocess.run(['./b.py'])
retcode = res.returncode
if retcode > 0:
print(f'a.py: Errored, retcode: {retcode}')
elif retcode < 0:
print(f'a.py: Killed, retcode: {retcode}')
else:
print(f'a.py: Completed, retcode: {retcode}')
b.py
#!/usr/bin/env python3
import subprocess
import sys
res = subprocess.run(['./c.sh'])
retcode = res.returncode
print(f"b.py: process exited with {retcode}")
sys.exit(retcode)
c.sh
#!/bin/bash
sleep 300
如果我運行a.py
然后kill -9 <c.sh pid>
我收到以下輸出
$ ./a.py
b.py: process exited with -9
a.py: Errored, retcode: 247
我想要實作的是能夠從a.py
腳本c.sh
被殺死,也就是說,我期望以下輸出:
$ ./a.py
b.py: process exited with -9
a.py: Killed, retcode: -9
據我了解,問題在于執行sys.exit(retcode)
類似操作的指令,-9%6
因此我無法判斷c.sh
是被殺死還是出錯。
如何檢測差異?
謝謝
uj5u.com熱心網友回復:
https://tldp.org/LDP/abs/html/exitcodes.html 信號有特殊含義,大于128,小于等于255,可以通過這個資訊來檢測差異。
uj5u.com熱心網友回復:
從sys.exit的檔案中:
可選引數 arg 可以是給出退出狀態的整數(默認為零),也可以是其他型別的物件。如果它是一個整數,則零被認為是“成功終止”,任何非零值都被 shell 等視為“例外終止”。大多數系統要求它在 0-127 范圍內,否則會產生未定義的結果。一些系統有為特定退出代碼分配特定含義的約定,但這些通常不發達;Unix 程式通常使用 2 表示命令列語法錯誤,使用 1 表示所有其他型別的錯誤。
您不能只將-9
代碼傳遞給sys.exit()
. 您可以做的是在模塊中創建一個函式b.py
并從a.py
. 然后腳本a.py
可以檢查回傳數b
并列印相應的訊息。a.py
應該檢查retcode
子行程b
只檢查是否b
終止沒有錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507961.html
標籤:Python python-3.x 子进程
上一篇:如何在PythonPandasDataframe中有條件地連接2列
下一篇:串列理解平面串列?