Python 2.7 / 3.7中的“subprocess”返回代码差异的一些帮助将不胜感激。
我正在更新一些代码,以便它在Python 2.7和Python 3.7中产生相同的输出。
该代码使用“子进程”运行外部程序并读取程序的返回代码。如果外部程序运行超过特定时间,则它会杀死自己并返回“-1”的返回代码。当外部程序在命令提示符中运行时,返回代码为“-1”,如下所示:
C:〉test.exe -itest.cmd test.stl〉null
- C:〉echo %ERRORLEVEL%*
我的天啊
我可以在Python中使用subprocess运行该命令,如下所示(我也使用os.system * 运行它,只是作为比较 *):
import os, sys, subprocess
print("\nOutput for Python version: " + sys.version.split("(")[0])
cmd = "test.exe -itest.cmd test.stl > null"
p_input = cmd.split()
p = subprocess.Popen(p_input, stdout=subprocess.PIPE)
p.communicate()
p_rc = p.returncode
print("subprocess return code :" + str(p_rc))
os_rc = os.system(cmd)
print("os.system return code :" + str(os_rc))
当我用Python 2.7运行代码时,我得到了'expected'返回代码:
- Python版本的输出:2.7.16*
- 子进程返回码:-1*
- os.系统返回码:-1*
当我用Python 3.7运行代码时,我得到了一个不同的子进程返回代码(但不是os.system):
- Python版本的输出:3.7.9*
- 子进程返回码:4294967295*
- os.系统返回码:-1*
这个不同的结果是预期的吗?不管是不是,我如何在Python 3.7中获得我想要的返回代码'-1'?
在Windows 10上运行Python 2.7.16 / 3.7.9
提前感谢:-)
尼克
1条答案
按热度按时间dgsult0t1#
***subprocess.returncode***现在(从Python 3.3开始)返回UNSIGNED 32位整数,所以返回的值不是不正确的-只是不是有符号的32位整数。要查看负返回代码,答案需要转换为SIGNED 32位整数。这可以通过在上面的代码中添加以下内容来完成:
这给出了Python 3.7的以下输出:
Python版本的输出:3.7.9
子进程返回码:4294967295
签名返回码:-1
os.系统返回代码:-1
做同样事情的其他方法(感谢www.example.com上的kknechteldiscuss.python.org)...使用struct:
或者: