2014-01-07 81 views
0

我的python應該執行帶有5個參數的/home/file.sh,如下所示。但是,每次執行我的python腳本時,它都會忽略參數,並且shell腳本將使用默認值執行。我也嘗試把殼變成假,但沒有成功。有任何想法嗎 ?先謝謝你!使用參數通過python執行shell腳本在執行shell腳本時始終採用默認值

var1='-t' 
var2='m' 
var3='20130105' 
var4='-f' 
var5='test.txt' 

process=subprocess.Popen(['/home/file.sh', str(var1), str(var2), str(var3), str(var4), str(var5)],shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
process.wait() 
lists=process.communicate()[0] 

我曾嘗試以下,但它再次使用默認參數

process=subprocess.Popen(['/home/file.sh -t m 20140105 -f test.txt')],shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+0

此外,請注意,您不必顯式'wait',因爲'communic'意味着等待進程退出。 – Krumelur

回答

0

嘗試像這樣:

process=subprocess.Popen('/home/file.sh -t m 20140105 -f test.txt', shell=True, ...) 

,而不必擔心傳遞列表的命令。

+0

嗨dg99,我試過,但結果相同。謝謝 –

+0

你怎麼知道'file.sh'做錯了什麼? 'file.sh'的輸出與預期的輸出是什麼? – dg99

0

您可以使用參數列表並設置shell=False,例如,

process=subprocess.Popen(["./test.sh","a","b","c"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
print process.communicate()[0] 

,或者你可以使用一個字符串參數,並讓殼解析它通過設置shell=True,例如

process=subprocess.Popen("./test.sh a b c", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
print process.communicate()[0] 

但使用shell=True當你不能發送列表。

雙方將輸出

0: ./test.sh 
1: a 
2: b 
3: c 

如果test.sh是一個具有以下內容的可執行文件:

#!/bin/sh 

echo 0: $0 
echo 1: $1 
echo 2: $2 
echo 3: $3 

通常遊戲,我更喜歡使用shell=False以避免逃避參數字符串(這是比這應該是正確的)。但是使用shell有一些優點,比如路徑的擴展,能夠使用shell內部等等。

+0

您好Krumelur,我也試過,但結果相同......謝謝! –

+0

你確定你的腳本工作正常嗎?你能從常規shell運行這個命令行嗎? – Krumelur

+0

嗨,是的,它的工作來自命令..我仔細檢查腳本,如果有方法來修改它直接使用$ 1,$ 2,...。我會讓你更新謝謝! –