如何处理从 Python 中的子进程返回的负数?
How to deal with negative numbers that returncode get from subprocess in Python?
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 return:
- 成功为 0;
- 失败和错误是负数
我有一个特定的错误,即 installer.exe return 的 -307。但是 python 当执行 print(process.returncode)
它显示 4294966989 ... 我如何处理 python 中的负数,在这种情况下显示 -307?
我是 python 的新手,环境是 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 )
使用 NumPy:将无符号 32 位整数 4294966989 查看为有符号 32 位整数:
In [39]: np.uint32(4294966989).view('int32')
Out[39]: -307
仅使用标准库:
>>> import struct
>>> struct.unpack('i', struct.pack('I', 4294966989))
(-307,)
将32位正整数转换成它的two's complement negative value:
>>> 4294966989 - (1 << 32) # mod 2**32
-307
因为 、Windows API 等函数 GetExitCodeProcess()
使用无符号 32 位整数,例如 DWORD
、UINT
。但是 cmd.exe
中的 errorlevel
是 32 位 有符号 整数,因此一些退出代码 (> 0x80000000) 可能显示为负数。
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 return: - 成功为 0; - 失败和错误是负数
我有一个特定的错误,即 installer.exe return 的 -307。但是 python 当执行 print(process.returncode)
它显示 4294966989 ... 我如何处理 python 中的负数,在这种情况下显示 -307?
我是 python 的新手,环境是 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 )
使用 NumPy:将无符号 32 位整数 4294966989 查看为有符号 32 位整数:
In [39]: np.uint32(4294966989).view('int32')
Out[39]: -307
仅使用标准库:
>>> import struct
>>> struct.unpack('i', struct.pack('I', 4294966989))
(-307,)
将32位正整数转换成它的two's complement negative value:
>>> 4294966989 - (1 << 32) # mod 2**32
-307
因为 GetExitCodeProcess()
使用无符号 32 位整数,例如 DWORD
、UINT
。但是 cmd.exe
中的 errorlevel
是 32 位 有符号 整数,因此一些退出代码 (> 0x80000000) 可能显示为负数。