Python子进程调用在使用find时抛出错误
我正在使用Python子进程调用在使用find时抛出错误,python,bash,python-3.x,find,subprocess,Python,Bash,Python 3.x,Find,Subprocess,我正在使用子流程库中的调用在python3中制作脚本。我遇到的问题是,这个命令find-mtime+3 | xargs rm-rf在放入终端时可以正常工作,但当我这样做时: 来自子流程导入调用 调用([“查找”、“,-mtime”、“+3”、“|”、“xargs”、“rm”、“-rf”]) 我最终得到了一个类似以下内容的错误: find:路径必须位于表达式之前:| 用法:find[-H][L][P][Olevel][D help | tree | search | stat | rates |
子流程
库中的调用
在python3
中制作脚本。我遇到的问题是,这个命令find-mtime+3 | xargs rm-rf
在放入终端时可以正常工作,但当我这样做时:
来自子流程导入调用
调用([“查找”、“,-mtime”、“+3”、“|”、“xargs”、“rm”、“-rf”])
我最终得到了一个类似以下内容的错误:
find:路径必须位于表达式之前:|
用法:find[-H][L][P][Olevel][D help | tree | search | stat | rates | opt | exec | time][path…][expression]
1.
我做错了什么?请帮助:-)
|
不是命令参数;它是将两个命令连接在一起的shell语法
使用管道的最简单方法是将单个字符串传递给子流程
,并让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()
请参阅Python文档以了解。不是开玩笑吧?如果您确实在shell中运行了这个命令,您就不会有3天前的文件来测试python脚本。小心不要尝试这个!如果你想递归删除3天前修改过的所有文件和目录,它甚至不会提示。您应该将示例更改为
grep | sort
或甚至grep | kill
示例。这个太具破坏性了。