我正在尝试通过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')
答案 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 OpenSSL
和x509
上依次键入,以了解我在说什么。为了解决这个问题,我在一个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。