如何处理返回码从Python中的子进程获取的负数?

时间:2015-01-08 14:13:42

标签: windows python-3.x cmd subprocess exit-code

python中的这段脚本:

cmd = 'installer.exe --install ...' #this works fine, the ... just represent many arguments
process = subprocess.Popen(cmd)
process.wait()
print(process.returncode)

此代码在我看来运作正常,问题是.returncode的价值。

installer.exe没问题,对此进行了很多测试,现在我尝试在python中创建一个脚本,以便在执行此installer.exe的许多天内自动执行测试。

installer.exe返回: - 成功为0; - 失败和错误是负数

我有一个特定的错误,即installer.exe返回的-307。但是python在执行print(process.returncode)时显示4294966989 ...我如何处理python中的负数,在这种情况下显示-307?

我是python的新手,env是win7 32和python 3.4。

编辑:最终代码正常运行 这段代码的目的是运行许多简单的测试:

import subprocess, ctypes, datetime, time
nIndex = 0
while 1==1:

   cmd = 'installer.exe --reinstall -n "THING NAME"'
   process = subprocess.Popen( cmd, stdout=subprocess.PIPE )

   now = datetime.datetime.now()
   ret = ctypes.c_int32( process.wait() ).value
   nIndex = nIndex + 1

   output = str( now ) + ' - ' + str( nIndex ) + ' - ' + 'Ret: ' + str( ret ) + '\n'

   f = open( 'test_result.txt', 'a+' )
   f.write( output )
   f.closed

   print( output )

3 个答案:

答案 0 :(得分:5)

仅使用标准库:

>>> import struct
>>> struct.unpack('i', struct.pack('I', 4294966989))
(-307,)

答案 1 :(得分:3)

使用NumPy:查看无符号的32位int,4294966989,作为带符号的32位int:

In [39]: np.uint32(4294966989).view('int32')
Out[39]: -307

答案 2 :(得分:1)

将正32位整数转换为two's complement negative value

>>> 4294966989 - (1 << 32) # mod 2**32
-307

作为@Harry Johnston said,诸如GetExitCodeProcess()的Windows API函数使用无符号32位整数,例如DWORDUINT。但errorlevel中的cmd.exe是32位签名的整数,因此某些退出代码(> 0x80000000)可能会显示为负数。