[英]Python - subprocess.Popen not returning output
我正在使用Windows 7機器,現在已經安裝了使用PyDev實用程序進行python開發的STS。
我的代碼想要登錄到機器並返回輸出。 我目前的代碼是:
ssh = subprocess.Popen(["uname -a"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print (ssh)
result = ssh.stdout.readlines()
print (result)
這贊成了一個輸出:
<subprocess.Popen object at 0x02B35810>
[]
但是uname -a
命令應該產生Linux 3.10.0-514.10.2.el7.x86_64 #1 SMP Mon Feb 20 02:37:52 EST 2017 x86_64 x86_64 x86_64 GNU/Linux
知道為什么我不能捕獲輸出嗎?
您可以使用命令/ args調用uname
,在這樣的列表中正確拆分:
subprocess.Popen(["uname","-a"] ...
或像這樣的字符串快速和臟(你必須處理引用,但這里沒有):
subprocess.Popen("uname -a", ...
但不是這樣的:
subprocess.Popen(["uname -a"] ...
否則實際發出的命令是"uname -a"
(字面意思)。 當然,它不存在,應該拋出一個異常,但是因為你使用的是shell=True
所以它不會因為它在shell中運行不存在的命令(存在,所以subprocess
不會抱怨)
這是為什么你不應該在沒有絕對強制的情況下拋出shell=True
的眾多原因之一(例如運行shell內部命令)
檢查錯誤流(使用result = ssh.stderr.readlines()
)會顯示類似"uname -a": command not found
請注意,對輸出和錯誤流使用PIPE
可能會導致死鎖,除非您使用ssh.communicate()
在內部處理單獨線程中的流。
我對你的問題的建議只是使用check_output
因為你不需要在后台運行命令,你只需要它的輸出:
result = subprocess.check_output(["uname","-a"])
(略有不同,因為它不會創建線條而是唯一的緩沖區,您可以輕松地將strip
/ splitline
到)
請注意,如果您正在尋找一種可移植的方式來獲取系統類型或平台,我建議您使用os
模塊(例如, os.name
為Windows生成nt
)和platform
模塊,在這里您可以獲得系統架構,Linux發行版,等等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.