【问题标题】:Why subprocess.Popen doesn't work when args is sequence?为什么当 args 是序列时 subprocess.Popen 不起作用?
【发布时间】:2010-03-08 11:24:23
【问题描述】:

当 args 参数作为序列给出时,我遇到了 subprocess.Popen 问题。

例如:

import subprocess
maildir = "/home/support/Maildir"

这有效(它打印正确大小的 /home/support/Maildir 目录):

size = subprocess.Popen(["du -s -b " + maildir], shell=True,
                        stdout=subprocess.PIPE).communicate()[0].split()[0]
print size

但是,这不起作用(试试看):

size = subprocess.Popen(["du", "-s -b", maildir], shell=True,
                        stdout=subprocess.PIPE).communicate()[0].split()[0]
print size

怎么了?

【问题讨论】:

  • “不起作用”不是有用的错误描述!
  • @hop:您的评论没有说明为什么它没有用。 @pero:您可以通过包含执行命令时获得的输出来改进问题。显示预期输出和您获得的输出可以让我们知道当我们尝试复制您的问题时,我们是否看到了您所看到的内容。 (当然,既然你得到了答案,那么问题中一定有足够的信息。)

标签: python subprocess


【解决方案1】:

来自documentation

在 Unix 上,shell=True: […] 如果 args 是一个序列,第一项指定 命令字符串,任何附加项将被视为附加参数 外壳本身。也就是说,Popen 相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

在您的情况下翻译为:

Popen(['/bin/sh', '-c', 'du', '-s', '-b', maildir])

这意味着-s-bmaildir 被shell 解释为选项,而不是du(在shell 命令行上试试!)。

由于您的情况无论如何都不需要shell=True,因此您可以将其删除:

size = subprocess.Popen(['du', '-s', '-b', maildir],
                    stdout=subprocess.PIPE).communicate()[0].split()[0]

或者,您可以只使用您的原始方法,但在这种情况下您不需要列表。您还必须注意目录名称中的空格:

size = subprocess.Popen('du -s -b "%s"' % maildir, shell=True,
                    stdout=subprocess.PIPE).communicate()[0].split()[0]

【讨论】:

    【解决方案2】:

    来自document

    在 Unix 上,使用 shell=True:如果 args 是 字符串,指定命令 要通过 shell 执行的字符串。 如果 args 是 sequence,则第一项 指定命令字符串,以及任何 额外的项目将被视为 额外的 shell 参数。

    所以,试试

    subprocess.Popen("du -s -b " + maildir, ...
    

    subprocess.Popen(["du","-s","-b",maildir], ...
    

    【讨论】:

    • 谢谢。如果我删除 shell=True,序列 ["du", "-s", "-b", maildir] 有效,但无论如何都不需要。
    • 相关点是附加项被视为 shell 参数,而不是 du 的参数
    【解决方案3】:

    应该是["du", "-s", "-b", maildir]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多