【问题标题】:subprocess.Popen produces error while, commands run smoothly in command line (ERROR: find: paths must precedeexpression)subprocess.Popen 产生错误,而命令在命令行中顺利运行(错误:查找:路径必须在表达式之前)
【发布时间】:2014-09-15 08:42:30
【问题描述】:

我正在尝试将一些命令合并到一个 python 脚本中,我通常会在命令行 (Ubuntu 14.04) 中使用这些命令来处理文件。

我尝试按照subprocess help page 上的示例进行操作,但出现以下错误消息:

find: paths must precede expression: |
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

我有点难过的原因是,如果我直接在控制台中键入它,它会正确执行。我怀疑参数的解析方式有问题,但我认为argv1argv2 的打印结果看起来像预期的那样(基于示例)。

import subprocess, shlex



cmd1 = "find . -name *.tgz | xargs -i pigz -dv {}"
cmd2 = "find . -name *.tar | xargs -i tar -xfv {} -C decompressed --wildcards '*B5.TIF' '*B6.TIF' '*B8.TIF' "

args1 = shlex.split(cmd1)
args2 = shlex.split(cmd2)

print args1
print args2 

subprocess.call(args1)
subprocess.call(args2)

我尝试了subprocess.call()subprocess.Popen(),结果相同。非常感谢任何建议。

【问题讨论】:

    标签: python linux shell ubuntu subprocess


    【解决方案1】:

    subprocess.Popen(args1,shell=True)subprocess.call(args1,shell=True)shell=True 在我的 Ubuntu 14.04 上运行良好。

    警告 执行包含来自不受信任来源的未经处理的输入的 shell 命令会使程序容易受到 shell 注入的攻击,这是一个严重的安全漏洞,可能导致任意命令执行。出于这个原因,强烈建议不要在从外部输入构造命令字符串的情况下使用 shell=True:

    【讨论】:

    • 谢谢!你是对的,shell=True 有效。你能详细说明一下,什么时候有必要?这里有很多帖子,文档本身警告使用shell=True
    • @Phill 我添加了关于使用 shell=True 的重要部分,如果您从外部源获取输入,那么这将是危险的,在您的情况下只需运行命令,您不必担心。
    • 其实我太激动了,它执行了……但它否定了管道。输出非常类似于find 命令的输出,但不是通过下一步后的输出。
    【解决方案2】:

    我相信您会因为命令中的管道而遇到此错误。

    你会想要做这样的事情而不是(这仅适用于 cmd1):

    cmd1=`find . -name *.tgz | xargs -i pigz -dv {}`
    # should instead be
    p1 = subprocess.Popen(["find", ".", "-name", "*.tgz"], stdout=subprocess.PIPE)
    p2 = subprocess.Popen(["xargs", "-i", "pigz", "-dv", "{}"], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
    output = p2.communicate()[0]
    

    更多详情请阅读subprocess documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2016-07-18
      • 1970-01-01
      • 2023-03-08
      • 2016-02-19
      • 1970-01-01
      • 2011-07-05
      • 2021-02-28
      相关资源
      最近更新 更多