我正在使用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
>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
>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。
为什么在情况3中,Python子进程无法获取退出代码?
如您的注释所述,如果您运行 相同的命令, 则命令提示符和使用Pythonsubprocess模块都会产生相同的结果(0退出代码)。
subprocess
您可能会看到不同的退出代码,因为您使用了 不同的 命令。毫不奇怪。Pythonsubprocess模块返回正确的(对于给定命令)退出代码。
如果它没有返回正确的退出状态,那么您可以& exit在cmd.exe命令的末尾添加作为获取正确返回代码的解决方法,请参阅Python问题上的“ Windows子进程:shell = True的错误返回代码”追踪器:
& exit
from subprocess import check_call check_call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & exit', shell=True)