subprocess.run()产生的结果与手动输入不同

时间:2017-05-23 17:34:05

标签: python python-3.x

我正在尝试通过Python脚本运行以下Windows控制台命令:

C:\My\Path\openssl.exe x509 -in C:\My\PEM\mypem.pem -noout -subject > C:\My\Data\data.txt

如果直接放入控制台,则生成预期的1KB文件。

使用subprocess.run()没有。它生成一个文件,但是一个0KB的文件,好像它没有抓取stdout响应。

我没有成功尝试过:

# produces b''
args = 'C:/My/Path/openssl.exe x509 -in C:/My/PEM/mypem.pem -noout -subject'
data = subprocess.check_output(args)
print (data)

# produces b''
result = subprocess.Popen('C:/My/Path/openssl.exe x509 -in C:/My/PEM/mypem.pem -noout -subject', stdout = subprocess.PIPE)
print (result.stdout) 

# produces a 0KB data.txt
# probably also producing a b'' thus the 0KB
subprocess.run('C:/My/Path/openssl.exe x509 -in C:/My/PEM/mypem.pem -noout -subject > C:/My/Data/data.txt')

2 个答案:

答案 0 :(得分:2)

如果您希望将字符串解析为带参数的命令,则需要使用shell=True

result = subprocess.Popen('C:/My/Path/openssl.exe x509 -in C:/My/PEM/mypem.pem -noout -subject', stdout = subprocess.PIPE, shell=True)
print(result.stdout)

或者您可以将命令指定为列表:

result = subprocess.Popen(['C:/My/Path/openssl.exe', 'x509', '-in', 'C:/My/PEM/mypem.pem', '-noout', '-subject'], stdout = subprocess.PIPE)

答案 1 :(得分:0)

我知道这是一个老问题,但这是我的解决方案:

我绝对不清楚为什么会出现这个问题,但是我假设OpenSSL必须是一个shell,然后x509是OpenSSL内部打开的另一个shell,这会在Windows上使用subprocess产生问题,但不是Linux。

您可以依次在CMDline OpenSSLx509上依次键入,以了解我在说什么。为了解决这个问题,我在一个subprocess命令中打开了假定的OpenSSL和x509 shell,然后使用subprocess.PIPE将其余所需的数据输入到进程的stdin中。这是我的程序的一个示例,我相信您可以在您的程序中进行修改以使其正常工作:

p=subprocess.Popen("openssl x509 -in " + VARS["CLIENTCERT"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
aissuer = p.communicate(bytes("-noout -issuer -nameopt multiline,-align,-esc_msb,utf8,-space_eq;", "utf-8"))[0].decode().strip("\n") # gets stdout

请记住,如果要在UNIX和Windows上运行,则应指定两个命令并根据os.name返回的内容(例如Windows的nt ...)运行它们。

此外,您应该将OpenSSL设置为PATH变量,这样就不必为OpenSSL指定路径。为此,请查看艾哈迈德(Ahmed)的answer