与Python 2.7相比,Python 3.7中的子进程返回不同(不正确?)的返回代码

qc6wkl3g  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(104)

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
提前感谢:-)
尼克

dgsult0t

dgsult0t1#

***subprocess.returncode***现在(从Python 3.3开始)返回UNSIGNED 32位整数,所以返回的值不是不正确的-只是不是有符号的32位整数。要查看负返回代码,答案需要转换为SIGNED 32位整数。这可以通过在上面的代码中添加以下内容来完成:

import ctypes
...
# get signed value return code in Python 3.*
p_rc = ctypes.c_int32(p_rc).value
print("SIGNED return code  :" + str(p_rc))

这给出了Python 3.7的以下输出:
Python版本的输出:3.7.9
子进程返回码:4294967295
签名返回码:-1
os.系统返回代码:-1
做同样事情的其他方法(感谢www.example.com上的kknechteldiscuss.python.org)...使用struct:

import struct
...
p_rc = struct.unpack('i', struct.pack('I', p_rc))[0]

或者:

p_rc = (p_rc - (1 << 32)) if (p_rc >= (1 << 31)) else p_rc

相关问题