在执行shell脚本时,通过python执行带有参数的shell脚本始终采用默认值

时间:2014-01-07 23:29:10

标签: python shell subprocess sh

我的python应该用五个参数执行/home/file.sh,如下所示。但是,每次执行我的python脚本时,它都会忽略参数,而shell脚本会使用默认值执行。我也尝试将shell转为False,但没有成功。有任何想法吗 ?提前谢谢!

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)

2 个答案:

答案 0 :(得分:0)

尝试如下:

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

不用担心为你的命令传递一个列表。

答案 1 :(得分:0)

您可以使用参数列表并设置shell=False,例如

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

或者您可以使用字符串参数并让shell通过设置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内部等等。