Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用子进程从标准输出获取结果_Python_Python 3.x_Subprocess - Fatal编程技术网

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

Python 无法使用子进程从标准输出获取结果,python,python-3.x,subprocess,Python,Python 3.x,Subprocess,我需要在发出命令后在控制台中显示结果 例如:H:/path/to/openssl.exe x509-in H:/path/to/cert.pem-noout-subject 当将此命令放置在打开的cmd.exe中时,会生成加密证书的值,但我无法使用子流程模块获得与返回变量相同的结果 到目前为止,我已经尝试过(其中cmd是上述示例): 所有的打印(输出)值都是b' 我甚至将cmd分解为多个arg,用于check_output()和Popen(),这样它看起来像:[“H:/path/to/opens

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

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

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

到目前为止,我已经尝试过(其中
cmd
是上述示例):

所有的
打印(输出)
值都是
b'

我甚至将
cmd
分解为多个
arg
,用于
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()
添加到上面,但打印了一个空行

我不习惯在windows上使用python,但请尝试以下操作。不要使用
shell=True
,而是尝试使用以下命令:

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

您是否尝试过将整个命令存储为原始字符串并使用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()
打印(输出[0])#用于标准输出
打印(输出[1])#用于标准错误

编辑:这对我来说对stderr很有效

print p.communicate()[1]

b'无法加载证书\r\n3636:错误:0D07209B:asn1编码例程:asn1_
get_对象:太长:./crypto/asn1/asn1_lib.c:142:\r\n3636:错误:0D068066:asn1-en
编码例程:ASN1\u检查\u TLEN:坏对象头:./crypto/ASN1/tasn\u dec.c:1281:
\r\n3636:错误:0D07803A:asn1编码例程:asn1\U项目\U EX\U D2I:嵌套asn1错误
r:./crypto/asn1/tasn_dec.c:380:Type=X509\r\n3636:error:0906700D:PEM例程:PEM

_ASN1_read_bio:ASN1 lib:./crypto/pem/pem_oth.c:83:\r\n'

一般提示:在
Popen
参数中设置
shell=True
是不安全的。尝试将
shlex.split(cmd)
作为您的第一个参数传递给
Popen
@Billy仍然返回
b'
。我试图弄明白为什么即使使用拆分命令,
Popen()
也没有执行上面“支持信息”中所述的第二个命令。@Billy更新的问题应该是注释而不是答案。这不起作用,因为
Popen()
没有执行列表中的下一个命令假定您的意思是
print(out[0])
打印(输出[1])
。是的,我有,两个都返回为
b'
。这几乎就像命令没有按顺序执行一样。我有一个类似的问题:我正在有效地运行openssl.exe,传递有效的参数并得到一个返回。然而,它似乎不去cmd.exe标准输出;它保留在openssl.exe中。我需要在H:/path/to/cert.pem-noout-subject中执行
C:\Users\Me>H:/path/to/openssl.exe x509,并获取
stdout
;当我运行
Popen()
时,它会生成一个结果,但它被放在CLI前面的一行,而不是
stdout
中。
cmd = ["H:/path/to/openssl.exe", "x509", "-in", "H:/path/to/cert.pem", "-noout", "-subject"]