簡體   English   中英

Python - subprocess.Popen不返回輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM