【问题标题】:Passing a list to a subprocess call将列表传递给子流程调用
【发布时间】:2015-05-06 08:22:08
【问题描述】:

我在尝试将列表传递给子进程调用命令时遇到问题。我正在尝试调用 windows robocopy 函数,传递它应该过滤的文件类型列表。

filter_list = ['*.txt', '*.dat']
call(["robocopy", src, dst, filter_list, "/e"])

因此,传递列表本身不起作用,robocopy 的输出表明它正在尝试查找文件类型“.txt.dat”,就好像整个列表是单个文件类型一样。

然后我尝试了以下

call(["robocopy", src, dst, ','.join(filter_list), "/e"])

但是,这给出了与我第一次尝试相同的输出。有谁知道如何传递一个列表并将其正确划分?非常感谢任何帮助!

【问题讨论】:

  • 你可以试试call(["robocopy", src, dst, " ".join(filter_list), "/e"]) 吗?
  • @StianOK 仍然是同样的结果。 Robocopy 现在采用“*.txt *.dat”的文件类型过滤器

标签: python subprocess call robocopy


【解决方案1】:

您实际上应该传递列表中的参数:

args = ["robocopy", src, dst]
args.extend(filter_list)
args.append("/e")
call(args)

【讨论】:

  • 啊,附加和扩展是我不知道的事情。非常感谢,这似乎奏效了! :)
  • robocopy 名称表明 OP 使用 Windows,其中列表被转换为 CreateProcess 的字符串,即它直接作为 argv 传递。跨度>
  • @J.F.Sebastian — 这是一个很好的观点。我删除了关于argv 的部分。即使在 Windows 上,Python 也能确保参数被正确引用,对吧?
  • @ThomasOrozco:“正确引用”可能由 Windows 上的每个单独程序定义。 Python 使用 Windows 上某些 C 程序使用的引用规则。 Follow links in this SO question
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2015-12-27
  • 2011-02-22
相关资源
最近更新 更多