Python:子进程并运行具有多个参数的 bash 脚本

Posted

技术标签:

【中文标题】Python:子进程并运行具有多个参数的 bash 脚本【英文标题】:Python: subprocess and running a bash script with multiple arguments 【发布时间】:2013-06-19 00:47:11 【问题描述】:

如何使用 subprocess 模块运行 bash 脚本,我必须为其提供几个参数?

这是我目前正在使用的:

subprocess.Popen(['/my/file/path/programname.sh', 'arg1 arg2 %s' % arg3], \
    shell = True)

bash 脚本似乎没有接受任何参数。非常感谢任何见解!

【问题讨论】:

【参考方案1】:

将参数作为列表传递,参见the very first code example in the docs:

import subprocess

subprocess.check_call(['/my/file/path/programname.sh', 'arg1', 'arg2', arg3])

如果arg3 不是字符串;在传递给check_call()之前将其转换为字符串:arg3 = str(arg3)

【讨论】:

如果我所有的args都是变量,我不把它们设置成字符串吗? @user2510173:我不明白这个问题。下面是一个例子:arg3 = 1,要转换它,你可以调用返回'1'str(arg3) 不幸的是,代码中的示例没有回答原始问题,因为他们选择了一个只有一个参数的过于简单的情况。目前尚不清楚多个参数是否应该作为单个字符串或多个字符串传递,除非您仔细阅读该页面以了解 POpen 背后的详细信息。即使这样,它也只是说,“通常首选提供一系列参数” - 而不是“您必须提供多个参数作为列表” @SteveBroberg:你的意思是Python官方文档中的例子吗?您可以在bugs.python.org 将其作为文档错误报告(patches are welcome,但指出可能存在的问题的简单报告也很有用)。【参考方案2】:
subprocess.Popen(['/my/file/path/programname.sh arg1 arg2 %s' % arg3], shell = True).

如果您使用shell = True,则脚本及其参数必须作为字符串传递。 args 序列中的任何其他元素都将被视为 shell 的参数。

您可以在 http://docs.python.org/2/library/subprocess.html#subprocess.Popen 找到完整的文档。

【讨论】:

【参考方案3】:

再举一个例子,上面所有的都没有,

subprocess.Popen(['/your/script.sh %s %s %s' %(argument1,argument2,argument3)], shell = True)

请注意,当您输入%(argument1,argument2,argument3) 时,%( 之间不应有任何空格,例如% (argument1,argument2,argument3) 无效。

【讨论】:

【参考方案4】:

您好,我知道这个解决方案已经很晚了,但可以帮助某人。

示例:

import subprocess
pass_arg=[]
pass_arg[0]="/home/test.sh"
pass_arg[1]="arg1"
pass_arg[2]="arg2"

subprocess.check_call(pass_arg)

上面的例子提供了 arg1 和 arg2 作为参数给 shell 脚本 test.sh

本质上,子进程需要一个数组。因此,您可以填充一个数组并将其作为参数提供。

【讨论】:

【参考方案5】:

您忘记添加args 名称。

subprocess.Popen(args=['./test.sh', 'arg1 arg2 %s' % arg3], shell=True)

【讨论】:

所以文件路径也需要在 args 集中?

以上是关于Python:子进程并运行具有多个参数的 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Python线程化多个bash子进程?

Bash命令在终端中有效,但在python脚本中的“子进程”中无效[重复]

Python 子进程 - 通过 SSH 运行多个 shell 命令

使用子进程运行多个 bash 命令

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]