将变量从python传递到shell脚本

将变量从python传递到shell脚本,python,bash,shell,Python,Bash,Shell,我在python脚本中运行shell脚本,如下所示: call(['bash', 'run.sh']) 我想从python脚本内部传递run.sh几个变量。看起来我可以添加变量,类似这样: call(['bash', 'run.sh', 'var1', 'var2']) 然后在我的shell脚本中使用$1和$2访问它们。但是我无法让它工作。使用子进程调用shell脚本 subprocess.Popen(['run.sh%s%s'(var1,var2)],shell=True)。有两个内置py

我在python脚本中运行shell脚本,如下所示:

call(['bash', 'run.sh'])
我想从python脚本内部传递
run.sh
几个变量。看起来我可以添加变量,类似这样:

call(['bash', 'run.sh', 'var1', 'var2'])

然后在我的shell脚本中使用$1和$2访问它们。但是我无法让它工作。

使用子进程调用shell脚本


subprocess.Popen(['run.sh%s%s'(var1,var2)],shell=True)。

有两个内置python模块可用于此。一个是
os
,另一个是
子流程
。尽管看起来您正在使用
子流程
,但我将同时显示这两个过程

下面是我用于此目的的bash脚本示例

test.sh

echo $1
echo $2

使用子流程

>>> import subprocess
>>> subprocess.call(['bash','test.sh','foo','bar'])
foo
bar
>>> import os
>>> os.system('bash test.sh foo bar')
foo
bar
0
这应该是工作,你能告诉我们错误或输出,你目前得到的


使用操作系统

>>> import subprocess
>>> subprocess.call(['bash','test.sh','foo','bar'])
foo
bar
>>> import os
>>> os.system('bash test.sh foo bar')
foo
bar
0
请注意
os
在每次调用后打印的退出状态。

如果
call(['bash','run.sh'])
在没有参数的情况下工作,则在传递其他参数时没有理由不工作

您需要将变量的值替换为命令行参数,而不仅仅是将变量的名称作为字符串传递,如下所示:

call(['bash', 'run.sh', 'var1', 'var2'])
相反,请执行以下操作:

var1 = '1'
var2 = '2'
call(['bash', 'run.sh', var1, var2])
现在,如果
var1
var2
是字符串,这将起作用。如果不是,则需要将它们转换为字符串:

var1 = 1
var2 = 2
call(['bash', 'run.sh', str(var1), str(var2)])
或者您可以使用
shlex.split()


你不能让它工作是什么意思?您还得到了什么?如果
var1
包含空格或其他几个shell元字符中的一个,则此文件的可能副本将无法按预期工作。很少有好的理由使用单字符串参数来代替列表。