2013-02-28 116 views
4

我正在尋找從python內部使用bash命令的最佳方法。有什麼方法?我知道os.system和subprocess.Popen。python內部的bash命令

我嘗試了這些:

bootfile = os.system("ls -l /jffs2/a.bin | cut -d '/' -f 4") 
print bootfile 

這將返回a.bin預期,而且它retuns 0事後等打印:

a.bin 
0 

與啓動文件現在設置爲0,接下來的當我打印bootfile它只顯示爲0.哪個是退出值我猜,我該如何阻止這個值的干擾?

我也曾嘗試:

bootfile = subprocess.Popen("ls -l /jffs2/a.bin | cut -d '/' -f 4") 
print bootfile 

,但它似乎破壞了腳本,在我什麼也沒得到恢復所有,我做了,對嗎?

其中哪些更好,爲什麼?還有其他方式,什麼是首選方式?

+2

什麼是你的bash命令你的目標是什麼?我相信你可以在不調用bash的情況下在python中執行此操作。 – user1254498 2013-02-28 13:08:10

+1

你有沒有考慮閱讀'subprocess.Popen'的文檔? – Cairnarvon 2013-02-28 13:09:17

+0

我希望返回一個符號鏈接,這指向固件的名稱。所以在這種情況下,我想返回一個實際上指向實際bin文件名的a.bin – Paul 2013-02-28 13:09:32

回答

3

使用os.readlink(由@kojiro提議)和os.path.basename用於獲取只有namefile:

os.path.basename(os.readlink('/jffs2/a.bin')) 
+0

這是完美的謝謝,現在我想知道爲什麼popen沒有返回,我很滿意。 – Paul 2013-02-28 14:20:54

2

kojiro的評論關於os.readlink可能是你想要的。 我正在解釋你想要實現的。

os.system會返回您退出命令運行狀態。

subprocess.Popen將創建一個管道,以便您可以捕獲命令運行的輸出。
下面一行將捕獲的命令運行的輸出:

bootfile = subprocess.Popen(["bash","-c","ls -l /jffs2/a.bin | cut -d '/' -f 4"], stdout=subprocess.PIPE).communicate()[0] 

更多細節在http://docs.python.org/library/subprocess.html

+0

該subprocess.Popen命令將無法正常工作。請參閱subprocess.Popen文檔(特別是Popen()的「shell」參數)。 – user9876 2013-02-28 13:26:41

+0

err ...我忘了...編輯答案 – anishsane 2013-02-28 13:52:42

+0

感謝這很好,我只是不得不調整它,因爲不是返回a.bin,而是返回jffs2/a.bin,然後返回none,然後將該變量設置爲none。 – Paul 2013-02-28 14:04:01

1

@kojiro說,正確的答案是:

os.readlink('/jffs2/a.bin') 

但是,如果你真的想這樣做複雜的方式,那麼在Python 2.7:

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4" 
bootfile = subprocess.check_output(cmd, shell=True) 

或者對舊的蟒蛇:

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4" 
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
bootfile = p.communicate()[0] 
if p.returncode != 0: 
    raise Exception('It failed') 
+0

謝謝你,很高興認識不同的方式。我與popen的問題是bootfile = p.communicate [0]返回正確答案,然後返回None。 – Paul 2013-03-01 12:09:31

+1

我只是修正了一個錯字...嘗試p.communicate()[0]。 (p.communicate()返回一個元組,[0]位從該元組中取出第一個元素)。 – user9876 2013-03-01 16:22:27

+0

嗨,我自己解決了你的錯誤,謝謝,我應該提到這一點。事情是,當我訪問索引0時,它給了我正確的值,也沒有,然後將該變量標記爲無。這對我來說毫無意義。我做了另一種方式,但不知道爲什麼困擾我:) – Paul 2013-03-01 16:37:24