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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
Bash命令在终端中有效,但在python脚本中的“子进程”中无效[重复]
Python 子进程 - 通过 SSH 运行多个 shell 命令