繁体   English   中英

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

[英]subprocess.run() produces different result than manual input

我正在尝试通过 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')

如果要将字符串解析为带参数的命令,则需要使用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)

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

我完全不清楚为什么这是一个问题,但我假设 OpenSSL 必须是一个外壳,然后 x509 是在 OpenSSL 中打开的另一个外壳,这会在 Windows 上使用subprocess而不是 Linux 产生问题。

您可以在 CMDline OpenSSLx509上分别按顺序键入,以了解我在说什么。 为了解决这个问题,我在一个打开了假定OpenSSL和X509壳subprocess命令然后使用供给所需要的数据的其余部分进入工艺的stdin subprocess.PIPE 这是我的程序的一个例子,我相信你可以修改你的程序来完成这项工作:

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返回的内容运行它们(例如,nt for Windows...)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM