我需要在发出命令后在控制台中显示结果。处于打开的cmd.exe当但我无法得到同样的结果与使用subprocess
模块返回的变量无法从stdout中获得结果,子流程
例如为:H:/path/to/openssl.exe x509 -in H:/path/to/cert.pem -noout -subject
该命令产生一个加密的证书的值。
到目前为止我已尝试(其中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输出重定向到一个临时文件(出于安全目的),我在将内容读入变量后将其删除。
支持信息:
如果命令的第一部分是run(.exe文件),它会打开自定义控制台该程序。该命令的其余部分在该控制台中执行,然后该控制台关闭。但是,如果整个命令系列在cmd.exe控制台中使用,则输出将显示在该控制台中。因此,为什么使用" "
作为.bat的替代方法,因为它将它作为整个命令发布到打开的控制台。
使用subprocess.Popen(["cmd.exe"])
在C:\Python36>
打开控制台,我可以发出有问题的命令,并得到我想要的确切结果。我似乎无法抓住pythonically虽然。但是,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()
以上,但打印一个空行
一般提示:在'Popen'参数中设置'shell = True'是不安全的。尝试改为将'shlex.split(cmd)'作为第一个参数传递给'Popen'。 – Billy
@比利仍然返回'b'''。我试图找出为什么即使使用分割命令,'Popen()'也没有按照上述“支持信息”中的描述执行第二个命令。 – madeslurpy
@比利更新的问题 – madeslurpy