【问题标题】:Pass a variable from python to shell script将变量从 python 传递到 shell 脚本
【发布时间】:2023-05-28 05:57:02
【问题描述】:

我在这样的 python 脚本中运行一个 shell 脚本:

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

我想从 python 脚本内部传递run.sh 几个变量。看起来我可以附加变量,如下所示:

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

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

【问题讨论】:

标签: python bash shell


【解决方案1】:

您可以使用两个内置的 Python 模块。一个是os,另一个是subprocess。尽管看起来您使用的是 subprocess,但我会同时显示两者。

这是我为此使用的示例 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

注意每次调用后os 打印的退出状态。

【讨论】:

    【解决方案2】:

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

    您需要将变量的 values 替换为命令行参数,而不是像这样将变量的 names 作为字符串传递:

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

    相反,这样做:

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

    现在,如果 var1var2 是字符串,这将起作用。如果没有,则需要将它们转换为字符串:

    var1 = 1
    var2 = 2
    call(['bash', 'run.sh', str(var1), str(var2)])
    

    或者你可以使用shlex.split():

    cmd = 'bash run.sh {} {}'.format(var1, var2)
    call(shlex.split(cmd))
    

    【讨论】:

      【解决方案3】:

      使用 subprocess 调用你的 shell 脚本

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

      【讨论】:

      • 如果 var1 包含空格或其他几个 shell 元字符之一,这将无法按预期工作。很少有充分的理由使用 Popen 的单字符串参数来代替列表。
      【解决方案4】:
      import os
      def run():
          os.system('C:\\scrips\\mybash.bat')
      run()
      

      【讨论】: