我需要在發出命令後在控制檯中顯示結果。處於打開的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