无法使用子进程从标准输出获取结果

2023-12-29

我需要在发出命令后将结果显示在控制台中。

e.g.: H:/path/to/openssl.exe x509 -in H:/path/to/cert.pem -noout -subject

当放置在打开的 cmd.exe 中时,此命令会生成加密证书的值,但我无法使用以下命令获得与返回变量相同的结果subprocess module.

到目前为止我已经尝试过(其中cmd是例如多于):

# checking if output is going to stderr
out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
# attempt with Popen
out = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
# attempt with Popen not using communicate()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out = p.stdout.read()

All the print (out)值是b''.

我什至已经打破了cmd分成多个args对彼此而言check_output() and Popen()这样它看起来像:["H:/path/to/openssl.exe", "x509 -in H:/path/to/cert.pem -noout -subject"].

我确实有另一种方法来实现结果,但这需要运行包含以下命令的 .bat 文件:start cmd /k "... > H:/path/to/temp.txt"哪里的...是这里有问题的命令。这会将 .exe 输出重定向到临时文件(出于安全目的),我在将内容读入变量后将其删除。

支持信息:

如果运行命令的第一部分(.exe),它将打开该程序的自定义控制台。命令的其余部分在该控制台中执行,然后该控制台关闭。但是,如果在 cmd.exe 控制台中使用整个命令系列,则输出将显示在该控制台中。因此为什么使用" "在我的 .bat 的替代方法中,它将它作为整个命令发送到打开的控制台。

Use of subprocess.Popen(["cmd.exe"])打开控制台C:\Python36>我可以发出有问题的命令并获得我想要的确切结果。但我似乎无法以Python方式抓住它。然而,subprocess.Popen(["cmd.exe", "H:/path/to/openssl.exe"])不执行第二条命令;打开控制台但不启动 .exe 控制台。

Update:

我能够得到一个结果,但我不喜欢我是如何得到这个结果的。有没有更短的方法来执行以下操作:

p = subprocess.Popen("H:/path/to/openssl.exe", stdin=PIPE, stdout=PIPE)
# b for byte-type requirement
p.stdin.write(b"x509 -in H:/path/to/cert.pem -noout -subject")
p.stdin.close()
out = p.stdout.read()

我还可以通过以下方式产生结果:

p = os.popen("start cmd /k H:/path/to/openssl.exe -in H:/path/to/cert.pem -noout -subject")

尝试添加.read()与上面相同,但打印一个空行


您是否尝试过将整个命令存储为原始字符串并使用 shell=True 传递它

cmd = r'H:/path/to/openssl.exe x509 -in H:/path/to/cert.pem -noout -subject' p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out = p.communicate() print(out[0]) #for std out print(out[1]) # for std err

编辑:这对我来说对 stderr 有用,

print p.communicate()[1]

b'unable to load certificate\r\n3636:error:0D07209B:asn1 encoding routines:ASN1_ get_object:too long:./crypto/asn1/asn1_lib.c:142:\r\n3636:error:0D068066:asn1 en coding routines:ASN1_CHECK_TLEN:bad object header:./crypto/asn1/tasn_dec.c:1281: \r\n3636:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 erro r:./crypto/asn1/tasn_dec.c:380:Type=X509\r\n3636:error:0906700D:PEM routines:PEM _ASN1_read_bio:ASN1 lib:./crypto/pem/pem_oth.c:83:\r\n'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用子进程从标准输出获取结果 的相关文章

随机推荐