2016-11-07 79 views
0

我有一些像这样的代码:运行grep的 - 不工作

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

我希望到grep MacOS的字典一定的模式,并将结果写入words.txt。例如,如果我想要执行类似grep '\<a.\>' /usr/share/dict/words的操作,则可以使用p = "'\<a.\>'"运行上述代码。但是,子流程调用似乎无法正常工作,并且words.txt仍为空。任何想法,为什么这是?另外,有没有办法将正则表达式应用于/usr/share/dict/words而不调用grep子进程?

编辑: 当我在终端运行grep '\<a.\>' /usr/share/dict/words,我得到的话,如:AA 广告 AE 啊 人工智能 AK 人 上午 的 AR 作为 在 AW 斧头 AY为导致终端(或者如果我在那里重定向他们的文件)。这是我在运行子进程调用后期望words.txt的结果。

+1

请至少提供一个您期望的匹配。 到目前为止,我认为你可以安全地从你的模式中移除字符和''''''''。你不必转义字符,因为你现在没有使用shell。 您当前的调用应该使用附加参数'shell = True' – woockashek

+0

@woockashek添加的示例匹配 –

回答

2

像@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来代替。

+0

谢谢!很好的解释和Python例子 –

-1

由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的尝试。

+0

您可以将标准输出绑定到打开的文件句柄上;这不是问题。 – tripleee