如何处理从Python中的subprocess返回的负数?

python中的这段脚本:

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

这个代码工作正常,在我看来,问题是.returncode的价值。

安装程序.exe是好的,做了很多testing,现在我试图在python中创build一个脚本来自动执行这个installer.exe很多天的testing。

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

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

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

编辑:最后的代码工作这段代码的作用是运行许多简单的testing:

 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 ) 

Solutions Collecting From Web of "如何处理从Python中的subprocess返回的负数?"

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

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

只使用标准库:

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

要将正的32位整数转换为其2的补码负值 :

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

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