【发布时间】:2014-10-14 11:49:50
【问题描述】:
我正在编写一个 Python 程序,我需要执行这个相当长的 shell 命令并在我的脚本中接收输出。
test = subprocess.Popen(shlex.split("find /home/disk1 -maxdepth 0 -name folder1* -o -name folder7*"), stdout=subprocess.PIPE, shell=True)
test.communicate()
我已经尝试了所有可能的代码变体,比如在参数中添加 'executable="/bin/bash",或者使用 subprocess.check_output 等。
每当我运行它并通过键入“test.communicate()”检查输出时,我都会得到“/home/disk1”目录中的所有文件,而不是我根据命令想要的文件。当我在 shell 中键入这个 find search 时,它工作正常。我不知道为什么它不起作用。我在互联网上浪费了最后两个小时。我在这里很困惑,请帮助我。
编辑:根据 cmets,我还尝试从参数中省略 'shell=True',这种情况下的响应是:
(b'', None)
我期待使用此命令的 4 个文件的名称。这还是不对的。谢谢。
编辑:对不起,我不是在寻找文件,我在寻找文件夹。
【问题讨论】:
-
你不需要
shell=True -
...作为一般规则,不仅仅是“不需要”,而是“不应该使用”。
shell=True被认为是有害的,完全违背了使用shlex.split()的目的。 -
...顺便说一句,您应该使用
-print0参数来查找以 NUL 分隔其输出,并使用.split('\0')将其划分 - 否则,包含换行符的文件名(其中,是的,完全合法)会搞砸你。当然,这是假设您没有做正确的事情,而是使用os.walk()。 -
你甚至不需要 fork 一个孩子就可以在这里运行
find。只需使用glob.glob('/home/disk1/file[17]*')即可获取匹配文件名列表。
标签: python linux bash shell subprocess