无法从子进程获取stdout的结果

时间:2017-06-05 12:55:57

标签: python python-3.x subprocess

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

例如: H:/path/to/openssl.exe x509 -in H:/path/to/cert.pem -noout -subject

此命令在放入已打开的cmd.exe时会生成加密证书的值,但我无法使用subprocess模块获得与返回变量相同的结果。

到目前为止,我一直在尝试(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()

所有print (out)值均为b''

我甚至将cmd分成了多个args check_output()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的替代方法中使用" ",因为它将它作为整个命令发布到打开的控制台。

使用subprocess.Popen(["cmd.exe"])C:\Python36>打开一个控制台,我可以发出有问题的命令并获得我想要的确切结果。我似乎无法蟒蛇般地抓住它。但是,subprocess.Popen(["cmd.exe", "H:/path/to/openssl.exe"])不执行第二个命令;打开一个控制台,但不启动.exe控制台。

更新

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

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()添加到上面,但打印一个空行

2 个答案:

答案 0 :(得分:0)

我不习惯在Windows上使用python,但请尝试以下方法。不要使用shell=True,而是尝试使用此cmd:

cmd = ["H:/path/to/openssl.exe", "x509", "-in", "H:/path/to/cert.pem", "-noout", "-subject"]

答案 1 :(得分:0)

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

传递它

print p.communicate()[1]

编辑:这对我有用stderr,

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'

NSData