2016-03-04 76 views
3

shell命令在我的終端,如果我跑:echo $(pwd),我/home/abr/workspace,但是當我試圖運行此腳本在Python這樣的:無法運行與子

>>> import subprocess 
>>> cmd = ['echo', '$(pwd)'] 
>>> subprocess.check_output(cmd, shell=True) 

我得到'\n'。如何解決這個問題?

+1

爲什麼你會這樣做而不是使用os包?似乎使用內置函數更容易,而不是依賴幾乎肯定是os/privilege/system/configuration/terminal依賴的外部調用。 os.path.abspath(os.path.curdir)似乎很簡單 –

+0

如果您將鼠標懸停在問題文本下的[tag:subprocess]上;你應該看到標籤的描述。點擊說明下的「info」鏈接。 [我收集了一些又一次被問及的問題。如果你研究這些問題;您可能會避免將來使用'subprocess'模塊時的常見問題](http://stackoverflow.com/tags/subprocess/info)。 – jfs

回答

1

使用os包:

import os 
print os.environ.get('PWD', '') 
1

試試這個:

cmd = 'echo $(pwd)' 
subprocess.check_output(cmd, shell=True) 

subprocess文檔它指定cmd應該是一個字符串shell=True時。
從文檔:

殼參數(默認爲假)指定是否使用 殼作爲要執行的程序。如果shell爲True,建議將作爲字符串傳遞,而不是作爲序列傳遞。


一種更好的方式實現這一目標是可能使用os模塊從Python標準庫,就像這樣:

import os 
print os.getcwd() 
>> "/home/abr/workspace" 

getcwd()函數返回代表當前工作目錄的字符串。

+0

這是正確的。如果你認爲它增加了任何東西,我會考慮添加python已經建立了更好的替代方案,或者引用子進程上的文檔:「但是,請注意Python本身提供了許多類似shell的功能的實現」 –

+0

@msn請考慮點擊複選標記有助於接受答案。 – Forge

1

subprocess模塊上的文檔:

如果args是一個序列中,第一項指定的命令串,並 任何其他項將被視爲附加的參數 外殼本身。

你想:

subprocess.check_output("echo $(pwd)", shell=True) 
1

命令subpreocess.check_output將返回命令的輸出,你在呼喚: 例子:

#echo 2 
2 
蟒蛇

>>>subprocess.check_output(['echo', '2'], shell=True) 
>>>'2\n' 

'\ n'包含在內這是命令的作用,它打印輸出sting,然後將電流放在一個新的行。

現在回到你的問題;假設你想輸出'PWD',首先你必須擺脫shell。如果您提供shell參數,則該命令將在shell環境中運行,並且您將看不到返回的字符串。

subprocess.check_output(['pwd']) 

將返回當前目錄+「\ n」

就我個人而言,我也很難理解你正在嘗試做的,但我希望這有助於解決這個問題。