将列表传递给subprocess.run

时间:2018-09-17 09:28:22

标签: python python-3.x bash subprocess

我有一个包含列表的脚本-列表只是我想传递给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

我不知道自己在做什么错,我尝试了各种各样的事情,所以我非常感谢您的帮助

1 个答案:

答案 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=TrueCOMSPEC环境变量指定默认值   贝壳。在Windows上唯一需要指定shell=True的时间是   您要执行的命令已内置到外壳程序中(例如dir或   copy)。您不需要shell=True来运行批处理文件或基于控制台的文件   可执行文件。

无法一次性执行一系列命令,您要做的是在生成外壳程序作为该外壳程序的选项时,执行第一个命令以及所有其他通过的命令。 / p>

您要改为执行此操作:

for command in commands:
    subprocess.run(command, shell=True)

或者:您希望将命令序列作为一个脚本执行:

subprocess.run(';'.join(commands), shell=True)

这表示:如果command内部的命令只是可执行文件,则应避免使用shell=True并使用shlex.split提供已解析的参数列表。如果需要指定执行命令的目录,则可以使用cwd的{​​{1}}参数(或任何类似的函数)。

在您的情况下,您需要以下内容:

Popen