2014-02-18 77 views
-1

我試圖在Python(2.6.4)中執行一個shell命令來在將它作爲參數傳遞給另一個程序之前評估一個簡單的公式。我的輸入是簡單的東西是這樣的:使用Popen獲取Python命令的輸出

$ [2 * 2]

我想以評估表達,並從我的Python腳本中得到的結果,所以我可以在以後使用它。目前,我這樣做(其中token$[2*2]):

token = subprocess.Popen(["echo", token], stdout=subprocess.PIPE).communicate()[0].strip() 

我希望可以將輸出爲4,而是它只是給我回我原來的令牌($[2*2])。顯然,當我跳到shell並手動運行此命令(echo $[2*2])時,我得到4正如預期的那樣。

有沒有什麼特別的關於Python如何執行這個命令,我錯過了?

+0

這可能是重複。我做了一些搜索,但我沒有很快找到答案。隨時關閉它。 –

+0

這實際上是一個__FAQ__,應該在標記wiki上。 – devnull

回答

2

當您在你的shell echo $[2*2],該評估$[2*2]並通過該評估的echo命令的結果。在你的Python代碼中,你傳遞的是$[2*2]直接回顯,因此,它正在返回。

你可以調用一個shell中subprocess.Popen評價使用了shell=True你的命令:

token = subprocess.Popen(["echo " + token], 
         stdout=subprocess.PIPE, shell=True).communicate()[0].strip() 
+0

即使這可能會失敗,如果/ bin/sh不是Bash,但這是另一點:) –

+0

非常真實,但F.J也提供了具體的答案。 – isedev

2

subprocess.Popen將自動逃避使得命令與那些文字字符串運行傳遞的任何參數,或者換句話說命令即運行相當於echo '$[2*2]'。有兩種方法來解決這個問題:

  • 使用shell=True

    >>> import subprocess 
    >>> token = '$[2*2]' 
    >>> subprocess.Popen("echo " + token, stdout=subprocess.PIPE, shell=True).communicate()[0].strip() 
    '4' 
    
  • 運行bash或另一個shell作爲命令:

    >>> subprocess.Popen(["bash", "-c", "echo " + token], stdout=subprocess.PIPE).communicate()[0].strip() 
    '4' 
    
相關問題