2017-04-13 365 views
1

我正在使用Windows 7機器,現在已經安裝了用於python開發的PyDev實用程序的STS。Python - subprocess.Popen不返回輸出

我的代碼想要登錄到一臺機器並返回輸出。我當前的代碼是:

 ssh = subprocess.Popen(["uname -a"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
     print (ssh) 
     result = ssh.stdout.readlines() 
     print (result) 

這yileds的輸出:

<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

任何想法,爲什麼我不能捕獲輸出?

回答

1

您可以致電uname與命令/ ARGS在列表中正確劃分是這樣的:

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產量nt爲窗口例如)和platform模塊,在那裏你可以得到系統架構,linux發行版等...

+0

感謝您的詳細解釋。如果我在Linux機器上運行它,這確實有效。但我目前正在開發Windows上的STS IDE。我得到錯誤 文件「C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ subprocess。在__init__ restore_signals,start_new_session) 文件「C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ subprocess.py」,第990行,在_execute_child中 startupinfo) FileNotFoundError:[WinError 2]系統找不到指定的文件 –

+1

已經更好了,解釋很簡單:除非你已經安裝了cygwin或MSYS,否則'uname'不存在於windows中如果你想知道OS&我推薦你使用便攜式'platform'模塊 –

+0

對不起,我沒有提到我正在運行的整個命令,它的'result = subprocess.check_output([「ssh」,「172.29.219.16」,「uname」]) '。這仍然給出同樣的錯誤。目標節點是Linux系統。 –