Python 2.7与3.7中subprocess返回码不一致问题求助
问题解答
差异是否正常?
这个差异是正常的,源于Python 2和Python 3对Windows系统进程退出码的处理逻辑不同:
- Windows系统中,进程退出码是无符号32位整数,
-1在底层会被存储为4294967295(即2^32 - 1)。 - Python 2会自动将无符号的退出码转换为有符号整数,所以直接返回
-1。 - Python 3则保留了系统返回的原始无符号值,因此得到
4294967295。而os.system在两个版本中行为一致,是因为它内部处理逻辑和subprocess不同,始终返回符合CMD中%ERRORLEVEL%的有符号值。
Python 3.7中获取预期返回码-1的方法
你可以通过将无符号的32位返回码转换为有符号整数来得到预期的-1。实现逻辑是:如果返回码大于2^31 - 1(即最大的32位有符号正整数),则减去2^32,将其转换为对应的负数值。
修改后的兼容代码如下:
import os, sys, subprocess def get_signed_returncode(rc): # 将Windows无符号32位退出码转为有符号整数 if rc > 0x7FFFFFFF: return rc - 0x100000000 return rc print("\nOutput for Python version: " + sys.version.split("(")[0]) cmd = "test.exe -itest.cmd test.stl > NUL" # Windows标准空设备是NUL,null也可兼容,但推荐用NUL p_input = cmd.split() p = subprocess.Popen(p_input, stdout=subprocess.PIPE) p.communicate() p_rc = get_signed_returncode(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和3.7的subprocess返回值都会统一为-1,和os.system的输出保持一致。
内容的提问来源于stack exchange,提问作者Nick Fromage
相关产品推荐
相关产品推荐

