簡體   English   中英

為什么有時Python子進程在運行進程后無法獲得正確的退出代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM