2016-02-12 71 views
1

在我的程序中,我想讓用戶運行一個shell命令或執行一個二進制文件。不管我讀了多少關於subprocess.Popen我都找不到一種方法來複制os.system()功能。在Python中使用子進程複製os.system功能?

我只是想echo $USER但似乎沒有任何工作。

談到shell=True ..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\ 
        stdout=subprocess.PIPE,\ 
        stderr=subprocess.PIPE).communicate() 
>>> ('\n', '') 

傳遞當前的環境瓦爾..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\ 
        env=os.environ\ 
        stdout=subprocess.PIPE,\ 
        stderr=subprocess.PIPE).communicate() 
>>> ('\n', '') 

那麼什麼是運行shell命令的正確方法?

-------編輯:要求---------

有人發佈答案,但也許我應該更具體。我想同時保留stdout,stderr並返回存儲值某處。所有的答案似乎都給出了一個或另一個。

+2

爲什麼不使用'os.environ ['USER']'? –

+1

甚至更​​好,'import getpass'和'getpass.getuser()'用於跨操作系統的兼容性。 –

+1

@DanielRoseman,因爲我不知道用戶將運行什麼命令,所以它只是通過所有環境更容易.. – Pithikos

回答

1

感謝massiou我想出答案的方向。罪魁禍首是當使用shell=True時,您應該將整個命令作爲單個字符串傳遞!

>>> subprocess.Popen(['echo $USER'], shell=True, \ 
        stdout=subprocess.PIPE,\ 
        stderr=subprocess.PIPE).communicate() 
>>> ('manos\n', '') 

原因是列表中的第一個參數是作爲shell腳本執行的參數。剩下的參數是針對shell程序本身的。

1

使用call方法

subprocess.call('echo $USER',shell=True) 

Altarnetivly:

var = subprocess.check_output('echo $USER',shell=True) # .rstrip('\n') 
print var 

還與subprocess.Popen()

process = subprocess.Popen("echo $USER",shell=True,stdout=subprocess.PIPE) 
print process.communicate()[0], 
+0

這似乎工作,但我似乎無法將輸出保存在一個變量,然後.. – Pithikos

+0

@Pithikos然後去與'check_output' – PYPL

+0

謝謝,這有效。然後,雖然我沒有返回代碼。這就是爲什麼我開始使用Popen ..我寧願保留所有stderr,stdout,返回代碼。 – Pithikos