2016-10-07 66 views
0

中的語句我試圖通過python運行bash代碼。正常語句(例如netstat)工作。但是,如果下面的函數不這樣做。我應該更改什麼才能正確運行以下代碼? 在此先感謝if subprocess.Popen

>>> import os 
>>> import subprocess 
>>> 
>>> os.setenv['a']='test' 
>>> _c = 'if [ "$a" == "test" ]; then echo $a; fi' 
>>> print(subprocess.Popen(_c, shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')) 
/bin/sh: 1: [: anto: unexpected operator 
+0

檢查[Python的子/ POPEN與修改後的環境(http://stackoverflow.com/questions/2231227/python-subprocess-popen-with-a-modified-environment) – sal

+0

似乎不成爲問題...'print(subprocess.Popen(「echo $ a」,shell = True,stdout = subprocess.PIPE).stdout.read()。decode('utf-8')) '完美的作品 – pidgey

+0

我認爲它與'shell = True'標誌實際上做了什麼有關,即啓動一個shell並將字符串中的命令傳遞給它。如果我是正確的,你正在嘗試做什麼,如果[\「$ a \」== \「test \」]被翻譯成'sh -c「;然後在你的linux shell上echo $ a; fi」' 。如果你運行它,你會得到同樣的錯誤。但是,如何擺脫困境,目前還沒有擺脫過我。希望有更多見解的人可以投入。 – sal

回答

2

您試圖在子運行的命令是繼bash殼語法,其中通過==執行字符串相等測試。現在,在shell = True的Unix上,shell默認爲/bin/sh,而相等測試通過簡單的=執行。你在這裏有兩個選項:

  1. 遵循sh語法在腳本
  2. 顯式調用「/斌/慶典」作爲可執行通過添加executable='/bin/bash'到POPEN

由於運行供選擇(1),更換_c如下所示,應該很好地工作:

import os, subprocess 
m_env = os.environ 
m_env['a'] = "test" 
_c = 'if [ "$a" = "test" ]; then echo $a; fi' 
print(subprocess.Popen(_c, shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')) 

打印出「測試」。

+1

使用shell語法,返回空字符串。 – pidgey

+1

我認爲'os.environ'是傳遞環境變量的正確方法。不知何故,我找不到任何參考setenv。這是在我的Ubuntu機器上工作。 – sal

+1

謝謝你,很高興我們找到了一個好的解決方案! – pidgey