通过 Python 运行 grep - 不起作用



我有一些这样的代码:

f = open("words.txt", "w")
subprocess.call(["grep", p, "/usr/share/dict/words"], stdout=f)
f.close()

我想在MacOs字典中查找某个模式,并将结果写入words.txt。例如,如果我想做grep '<a.>' /usr/share/dict/words之类的事情,我就会用p = "'<a.>'"运行上面的代码。但是,子进程调用似乎不能正常工作,words.txt仍然为空。有什么想法吗?此外,有没有一种方法来应用regex /usr/share/dict/words而不调用grep子进程?

编辑:当我在我的终端上运行grep '<a.>' /usr/share/dict/words时,我得到这样的单词:aa广告ae啊人工智能正义与发展党艾尔我一个基于"增大化现实"技术作为在亚历山大-伍尔兹斧头ay作为终端中的结果(如果我将它们重定向到那里,则是一个文件)。这是我期望words.txt在运行子进程调用后所拥有的。

就像@woockashek已经评论过的那样,你没有得到任何结果,因为在你的输入文件中没有'<a.>'的点击。您可能实际上希望找到<a.>的命中,但显然您需要省略单引号,这会使您混乱。

当然,Python完全知道如何在文件中查找正则表达式。

import re
rx = re.compile(r'ba.b')
with open('/usr/share/dict/words', 'Ur') as reader, open('words.txt', 'w') as writer:
    for line in reader:
        if rx.search(line):
            print(line, file=writer, end='')

这里的单引号是Python字符串语法的一部分,就像命令行中的单引号是shell语法的一部分一样。在这两种情况下,它们都不是您正在搜索的实际正则表达式的一部分。

subprocess.Popen文档模糊地暗示了一个经常被忽视的事实,即当你没有shell=True时,shell的引用是不必要的或有用的(通常你应该避免,无论如何,出于这个和其他原因)。

很不幸,Python不支持<>作为词边界运算符,所以我们不得不使用(功能等效的)b来代替。

由call()启动的进程的标准输入和输出通道绑定到父进程的输入和输出。这意味着调用程序不能捕获命令的输出。使用check_output()捕获输出以供以后处理:

import subprocess
f = open("words.txt", "w")
output = subprocess.check_output(['grep', p ,'-1'])
file.write(output)
print output
f.close()

PD:我希望它能工作,我不能检查答案,因为我没有MacOS来尝试。

最新更新