use*_*pal 5 python windows subprocess jython sikuli
我正在使用 Python 子进程在 Windows 7 上运行外部脚本。我正在尝试获取退出代码。
在情况 1 中,我运行一个 python 脚本test1.py。
测试1.py
import sys
sys.exit(24) <--exit code
Run Code Online (Sandbox Code Playgroud)
myscript1.py
import subprocess
process = subprocess.Popen(["python", "C:\\path\\to\\test1.py"], stdout=subprocess.PIPE)
process.wait()
print process.returncode
Run Code Online (Sandbox Code Playgroud)
在 Windows 命令提示符中,当我运行脚本时,我得到以下输出:
>python test1.py
>
>echo %errorlevel%
>24
>
>python myscript1.py
>24
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到在这种情况下子进程能够获得正确的退出代码。
在情况 2 中,我运行一个批处理文件test2.cmd。
测试2.cmd
EXIT /B 56 <--exit code
Run Code Online (Sandbox Code Playgroud)
myscript2.py
import subprocess
process = subprocess.Popen(["C:\\path\\to\\test2.cmd"], stdout=subprocess.PIPE)
process.wait()
print process.returncode
Run Code Online (Sandbox Code Playgroud)
在 Windows 命令提示符中,当我运行脚本时,我得到以下输出:
>test2.cmd
>
>echo %errorlevel%
>56
>
>python myscript2.py
>56
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到在这种情况下子进程也能够获得正确的退出代码。
在案例 3 中,我运行SikuliX脚本。
test3.sikuli
xxx xxx (sikuli script here)
xxx xxx
...
exit(16) <--exit code
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在 Windows 命令提示符中,当我运行脚本时,我得到以下输出:
>C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli
>... (stdout + stderr)
>16
>
>echo %errorlevel%
>16
>
>python myscript3.py
>0
Run Code Online (Sandbox Code Playgroud)
在情况 3 中,当我在命令提示符下手动运行脚本时,它能够设置%errorlevel%。当我使用 Python 子进程运行脚本时,子进程无法获取正确的退出代码。它总是返回 0。
为什么Python子进程在情况3中无法获取退出代码?
正如您的评论所说,如果您运行相同的命令,那么命令提示符和使用 Pythonsubprocess模块都会产生相同的结果(0 退出代码)。
由于您使用不同的命令,您可能会看到不同的退出代码。这里并不奇怪。Pythonsubprocess模块返回正确的(对于给定命令)退出代码。
如果它没有返回正确的退出状态,那么您可以& exit在 cmd.exe 命令末尾添加作为获取正确返回代码的解决方法,请参阅Python 问题上的“Windows 上的子进程:shell=True 的错误返回代码”追踪器:
from subprocess import check_call
check_call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & exit',
shell=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7900 次 |
| 最近记录: |