我有一个包含列表的脚本-列表只是我想传递给subprocess.run
的一些参数
commands = ["bash command 1", "bash command 2",..]
这是我的代码
commands = ["bash command 1", "bash command 2",..]
process = subprocess.run([commands], stdout = subprocess.PIPE, shell = True)
如何将列表传递给subprocess.run?
这是回溯
Traceback (most recent call last):
File "./retesting.py", line 18, in <module>
process = subprocess.run([commands], stdout = subprocess.PIPE, shell = True)
File "/usr/lib/python3.5/subprocess.py", line 383, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.5/subprocess.py", line 676, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.5/subprocess.py", line 1221, in _execute_child
restore_signals, start_new_session, preexec_fn)
TypeError: Can't convert 'list' object to str implicitly
我不知道自己在做什么错,我尝试了各种各样的事情,所以我非常感谢您的帮助
答案 0 :(得分:1)
在使用shell=True
之前,您必须了解它的作用。拿the documentation for Popen
。它指出:
shell
参数(默认为False
)指定是否使用 shell作为要执行的程序。 如果外壳为True
,则为 建议将args作为字符串而不是作为序列传递。在带有
shell=True
的Unix上,shell默认为/bin/sh
。如果args
是一个 字符串,该字符串指定要通过外壳执行的命令。 这意味着该字符串必须完全按照其格式设置 在shell提示符下键入时。例如,这包括引号或 反斜杠转义使用空格的文件名。 如果args
是 顺序,第一项指定命令字符串,以及任何 其他项目将被视为外壳程序的其他参数 。也就是说,Popen
等效于:Popen(['/bin/sh', '-c', args[0], args[1], ...])
在Windows上具有
shell=True
,COMSPEC
环境变量指定默认值 贝壳。在Windows上唯一需要指定shell=True
的时间是 您要执行的命令已内置到外壳程序中(例如dir
或copy
)。您不需要shell=True
来运行批处理文件或基于控制台的文件 可执行文件。
无法一次性执行一系列命令,您要做的是在生成外壳程序作为该外壳程序的选项时,执行第一个命令以及所有其他通过的命令。 / p>
您要改为执行此操作: 或者:您希望将命令序列作为一个脚本执行: 这表示:如果command内部的命令只是可执行文件,则应避免使用 在您的情况下,您需要以下内容:for command in commands:
subprocess.run(command, shell=True)
subprocess.run(';'.join(commands), shell=True)
shell=True
并使用shlex.split
提供已解析的参数列表。如果需要指定执行命令的目录,则可以使用cwd
的{{1}}参数(或任何类似的函数)。Popen