使用find时,Python子进程调用会引发错误

时间:2016-08-13 00:07:33

标签: python bash python-3.x find subprocess

我正在python3使用call库中的subprocess制作脚本。我遇到的问题是这个命令find . -mtime +3 | xargs rm -rf在放入终端时会完全正常,但是当我这样做时:

from subprocess import call
call(["find", ".", "-mtime", "+3", "|", "xargs", "rm", "-rf"])

我最终得到的错误看起来像这样:

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

我做错了什么?请帮忙: - )

1 个答案:

答案 0 :(得分:3)

|不是命令参数;它是用于将两个命令连接在一起的shell语法。

使用管道的最简单方法是将单个字符串传递给subprocess并让shell解析它:

from subprocess import call
call("find . -mtime +3 | xargs rm -rf", shell=True)

在这种情况下,它很好用,因为命令行非常简单;什么都不需要引用。

您可以在Python中设置管道,但它不像单个|字符那样简洁。

from subprocess import Popen, PIPE
p1 = Popen(["find", ".", "-mtime", "+3"], stdout=PIPE)
p2 = Popen(["xargs", "rm", "-rf"], stdin=p1.stdout)
p1.stdout.close()
p2.wait()

请参阅further reference的Python文档。