【发布时间】:2014-08-24 15:45:32
【问题描述】:
我正在使用 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。
案例3为什么Python子进程获取不到退出码?
【问题讨论】:
-
为什么使用
<sikulicmd> <arg1> <arg2>运行jython 脚本?您手动运行的以echo %errorlevel%结尾的确切命令是什么?您需要 jython 脚本的输出(stdout/stderr)吗?无关:为什么你需要python和jython? jython 就够了吗? -
@J.F.Sebastian 嗨 Sebastian,我已经添加了更多问题描述。
-
如果在 jython 脚本中添加长时间的停顿会发生什么?父 python 脚本是否等待它?试试:
print(subprocess.call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & echo %errorlevel%', shell=True)) -
@J.F.Sebastian 您好 Sebastian,我使用
time.sleep(30)在 Jython 脚本中添加了一个长时间的停顿。父 python 脚本等待它完成。当我运行此命令print(subprocess.call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & echo %errorlevel%', shell=True))时,它会打印出 Jython 脚本执行的所有输出。最后,它打印出 2 个退出代码,echo %errorlevel%返回的 1,print(..)返回的 1,都是 0。问题是,当我在命令提示符下手动运行相同的 Jython 脚本时,%errorlevel%是正确设置。 -
如果您在命令提示符(是 cmd.exe 还是 PowerShell ?)?
标签: python windows subprocess jython sikuli