[英]python subprocess running unoconv throwing CalledProcessError exit code 8
[英]Why sometimes Python subprocess failed to get the correct exit code after running a process?
我正在使用Python子進程在Windows 7上運行外部腳本。我正在嘗試獲取退出代碼。
在案例1中,我運行python腳本test1.py
。
test1.py
import sys
sys.exit(24) <--exit code
myscript1.py
import subprocess
process = subprocess.Popen(["python", "C:\\path\\to\\test1.py"], stdout=subprocess.PIPE)
process.wait()
print process.returncode
在Windows命令提示符下,當我運行腳本時,我得到以下輸出:
>python test1.py
>
>echo %errorlevel%
>24
>
>python myscript1.py
>24
因此,您可以看到子進程能夠在這種情況下獲得正確的退出代碼。
在案例2中,我運行批處理文件test2.cmd
。
test2.cmd
EXIT /B 56 <--exit code
myscript2.py
import subprocess
process = subprocess.Popen(["C:\\path\\to\\test2.cmd"], stdout=subprocess.PIPE)
process.wait()
print process.returncode
在Windows命令提示符下,當我運行腳本時,我得到以下輸出:
>test2.cmd
>
>echo %errorlevel%
>56
>
>python myscript2.py
>56
因此,您可以看到子進程在這種情況下也能夠獲得正確的退出代碼。
在案例3中,我運行了一個SikuliX腳本。
test3.sikuli
xxx xxx (sikuli script here)
xxx xxx
...
exit(16) <--exit code
myscript3.py
import subprocess
process = subprocess.Popen(["C:\\path\\to\\runsikuli.cmd", "-r", "C:\\path\\to\\sikuli-script.sikuli"], stdout=subprocess.PIPE)
process.wait()
print process.returncode
在Windows命令提示符下,當我運行腳本時,我得到以下輸出:
>C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli
>... (stdout + stderr)
>16
>
>echo %errorlevel%
>16
>
>python myscript3.py
>0
在案例3中,當我在命令提示符中手動運行腳本時,它可以設置%errorlevel%。 當我使用Python子進程運行腳本時,子進程無法獲取正確的退出代碼。 它總是返回0。
為什么Python子進程無法獲取案例3中的退出代碼?
正如你的評論所說,如果你運行相同的命令,那么命令提示符和使用Python subprocess
模塊都會產生相同的結果(0退出代碼)。
您可能會看到不同的退出代碼,因為您使用不同的命令 這里不足為奇。 Python subprocess
模塊返回正確的(對於給定的命令)退出代碼。
如果它沒有返回正確的退出狀態,那么您可以在cmd.exe命令的末尾添加& exit
以獲取正確的返回代碼,請參閱“Windows上的子進程:shell = True的錯誤返回代碼” Python問題跟蹤器:
from subprocess import check_call
check_call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & exit',
shell=True)
雖然這不能直接回答問題,但您可以使用此方法在Python子進程中間接獲取退出代碼。
創建批處理文件batch.cmd
。 在該文件中,調用要執行的命令,如下所示:
call %1 -r %2
EXIT /B %errorlevel%
在你的python腳本中:
import subprocess
exitcode = subprocess.call(r'C:\path\to\batch.cmd C:\path\to\runsikuli.cmd C:\path\to\sikuli-script.sikuli', shell=True)
print "Exit Code = "+str(exitcode)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.