2014-04-20 73 views
1

我試圖做一個簡單的命令讓我可以在Python中完全運行bash,包括輸出字符串。使用python獲取bash輸出

此功能對我在工作中使用的系統工作很大:

import subprocess 

def run(command): 
    output = subprocess.check_output(command, shell=True) 
    return output 

但是,現在,我使用它在國內和PATH變量不匹配,一個在我的終端。

所以,當我執行

run('ls') 

我得到這個:

/bin/sh: ls: command not found 

這是有道理的,因爲胡說,我從運行

print run('/usr/bin/env') 

獲取路徑是

現在0

,我可以通過彌補這一切:

run('/bin/ls') 

但是,這違背了使用此命令,這是忠實地模仿bash殼的全部目的。

我該如何讓run()使用系統的PATH或者創建一個可以工作的等價函數?

(關於使用'shell=True'的危險也沒有陳詞濫調,請,這是一個像lsps axw無害命令所有個人使用。)

+0

的鉛(http://plumbum.readthedocs.org)庫源可能是很有幫助。 – peakxu

+1

在工作和家中,os.getenv('PATH')在Python進程中返回什麼? – hd1

+0

在家裏,這是荒謬的'/ Library/Frameworks/Python。上面列出的框架/版本/當前/ bin/ 。在工作中,這是比較明智​​的'在/ usr/local/sbin中:/ usr/sbin目錄:/ sbin目錄:在/ usr/local/bin目錄:在/ usr/bin中:/ bin中:在/ usr/X11R6/bin中:/軟件/ DIST /管理/箱中:/ opt/WWW /了htdig /斌:/ usr/lib中/ JAVA /斌:/ usr/lib中/ JAVA/JRE/bin中:在/ usr /共享/ TEXMF/bin' –

回答

1

我要離開這個問題,因爲我覺得上面的run()命令有用,我找不到類似的東西。

但是,我的解決方案是非常系統特定的。問題是,我崇高的文本2中運行該腳本,並手動

"path": "/Library/Frameworks/Python.framework/Versions/Current/bin/", 

我這樣做是因爲我不得不讓ST2找到python正確的版本問題取代了路徑Python.sublime-settings。那麼,這也會覆蓋ST2中系統範圍的PATH變量,從而阻止我訪問簡單的shell程序,如ls

Python.sublime-settings刪除"path": ...行解決了我的問題。

編輯

由於suggested by mklement0,轉產到追加道路工程,以及:

"path": "$PATH:/Library/Frameworks/Python.framework/Versions/Current/bin/", 
+2

要_append to_現有'$ PATH',使用' 「路徑」: 「$ PATH:/Library/Frameworks/Python.framework/Versions/Current/bin/」'。 – mklement0