我正在从这样的 python 脚本中运行一个 shell 脚本:
call(['bash', 'run.sh'])
Run Code Online (Sandbox Code Playgroud)
我想run.sh从 python 脚本内部传递几个变量。看起来我只能附加变量,如下所示:
call(['bash', 'run.sh', 'var1', 'var2'])
Run Code Online (Sandbox Code Playgroud)
然后在我的 shell 脚本中使用 $1 和 $2 访问它们。但我无法让它发挥作用。
有两个内置的 Python 模块可以用于此目的。一个是os,另一个是subprocess。即使看起来您正在使用subprocess,我也会同时展示两者。
这是我为此使用的示例 bash 脚本。
测试文件
echo $1
echo $2
Run Code Online (Sandbox Code Playgroud)
使用子流程
>>> import subprocess
>>> subprocess.call(['bash','test.sh','foo','bar'])
foo
bar
Run Code Online (Sandbox Code Playgroud)
这应该有效,您能否向我们展示您当前获得的错误或输出。
使用操作系统
>>> import os
>>> os.system('bash test.sh foo bar')
foo
bar
0
Run Code Online (Sandbox Code Playgroud)
注意os每次调用后打印的退出状态。
如果在call(['bash', 'run.sh'])没有参数的情况下工作,那么当传递附加参数时它没有理由不工作。
您需要将变量的值替换到命令行参数中,而不仅仅是将变量的名称作为字符串传递,如下所示:
call(['bash', 'run.sh', 'var1', 'var2'])
Run Code Online (Sandbox Code Playgroud)
相反,请执行以下操作:
var1 = '1'
var2 = '2'
call(['bash', 'run.sh', var1, var2])
Run Code Online (Sandbox Code Playgroud)
现在只要 和 是字符串就可以var1了var2。如果不是,您需要将它们转换为字符串:
var1 = 1
var2 = 2
call(['bash', 'run.sh', str(var1), str(var2)])
Run Code Online (Sandbox Code Playgroud)
或者你可以使用shlex.split():
cmd = 'bash run.sh {} {}'.format(var1, var2)
call(shlex.split(cmd))
Run Code Online (Sandbox Code Playgroud)