2014-02-17 130 views
4
慶典

我已經試過什麼在How to force /bin/bash interpreter for oneliners如何強制使用os.system(),而不是使用外殼

告知這樣做

os.system('GREPDB="my command"') 
os.system('/bin/bash -c \'$GREPDB\'') 

但是沒有運氣,不幸的是我需要運行這個命令bash和subp不是這個環境中的一個選項,我僅限於python 2.4。任何建議讓我走向正確的方向?

+0

爲什麼['subprocess'模塊(http://docs.python.org /2.4/lib/module-subprocess.html)不是一個選項嗎?它在Python 2.4中受支持。 – falsetru

+0

敢肯定這是2.4.6,但是這是2.4.3 – sunshinekitty

+1

什麼不同的一個['EXEC *'](http://docs.python.org/2/library/os.html#os。 execl)函數? – user2357112

回答

5

兩個命令是在不同的子shell執行。

在第一system通話設置變量不影響第二system電話。

你需要一個字符串(它們與;合併)把兩個命令。

>>> import os 
>>> os.system('GREPDB="echo 123"; /bin/bash -c "$GREPDB"') 
123 
0 

注意您需要使用"$GREPDB"而不是'$GREPDBS'。否則,它會被逐字解釋而不是被展開。

如果你可以使用subprocess

>>> import subprocess 
>>> subprocess.call('/bin/bash -c "$GREPDB"', shell=True, 
...     env={'GREPDB': 'echo 123'}) 
123 
0 
+0

不幸的是,這仍然給我外殼錯誤:-( – sunshinekitty

+0

@ 0n35,你可以發佈回溯? – falsetru

0

是否有可能對你來說,改變誰啓動應用程序的用戶的默認shell? 你可以嘗試使用chsh來做到這一點。

+1

如果你在bash shell並運行一個調用'os.system(command)'的python腳本,默認情況下它會運行在Bourne shell('sh')中。您需要使用'/ bin/bash -c'作爲前綴,例如:'os.system(「/ bin/bash -c \」echo'hello world'\「」)' – mgoldwasser

1

下面的解決方案仍然最初調用一個外殼,但它切換到抨擊你正試圖執行命令:

os.system('/bin/bash -c "echo hello world"') 
0

我用這個:

subprocess.call(["bash","-c",cmd]) 

//好的,忽略此,因爲我沒有注意到subpr沒有考慮過。

+0

請解釋一下它是如何工作的?爲什麼它是一個解決方法嗎? – Stibu

+0

@Stibu實際上它是一種變通方法來解決我的問題msysgit環境的窗口。 –

0

我搜索這個命令了一些日子,發現真正的工作代碼:

import subprocess 

def bash_command(cmd): 
    subprocess.Popen(['/bin/bash', '-c', cmd]) 

code="abcde" 
// you can use echo options such as -e 
bash_command('echo -ne "'+code+'"') 

輸出:

abcde 
相關問題