gpt4 book ai didi

Python Popen grep

转载 作者:太空狗 更新时间:2023-10-30 00:30:24 26 4
gpt4 key购买 nike

我希望 Popen 执行:

grep -i --line-buffered "grave" data/*.txt

当从 shell 运行时,这给了我想要的结果。如果我开始,在我测试 grep 的同一个目录中,一个 python repl 并遵循 the instruction from the docs , 我获得了应该是正确的参数列表来为 Popen 提供:

['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']

p = subprocess.Popen(args) 的结果是

grep: data/*.txt: No such file or directory

如果我尝试 p = subprocess.Popen(args, shell=True),我得到:

Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

关于如何执行所需流程的任何帮助?我在使用 MacOS Lion。

最佳答案

如果您在 bash 中键入 *,shell 会在执行命令之前将其扩展为给定目录中的文件。 Python 的 Popen 没有做这样的事情,所以当你像这样调用 Popen 时你正在做的是告诉 grep 在 data 目录中有一个名为 *.txt 的文件,而不是data 目录中的所有 .txt 文件。该文件不存在,您会收到预期的错误。

要解决这个问题,您可以通过将 shell=True 传递给 Popen 来告诉 python 通过 shell 运行命令:

subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)

翻译成:

subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt'])

the documentation of Popen 中所述.

你必须在这里使用字符串而不是列表,因为你想执行 /bin/sh -c "grep -i --line-buffered "grave"data/*.txt"(注意,在命令周围加引号,使其成为 sh 的单个参数)。如果您使用列表,则运行此命令:/bin/sh -c grep -i --line-buffered "grave"data/*.txt,它为您提供简单运行 grep.

关于Python Popen grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com