我有一些像这样的代码:
f = open("words.txt", "w")
subprocess.call(["grep", p, "/usr/share/dict/words"], stdout=f)
f.close()
我想将某个模式的MacOs字典grep并将结果写入words.txt
。例如,如果我想执行grep '\<a.\>' /usr/share/dict/words
之类的操作,我会使用p = "'\<a.\>'"
运行上述代码。但是,子进程调用似乎无法正常工作,words.txt
仍为空。有什么想法吗?另外,有没有办法在不调用grep-subprocess的情况下将正则表达式应用于/usr/share/dict/words
?
编辑:
当我在终端中运行grep '\<a.\>' /usr/share/dict/words
时,我得到的字样如下:aa
广告
AE
啊
嗳
AK
人
上午
一个
AR
如
在
AW
斧头
ay作为终端的结果(或者如果我将它们重定向到那里的文件)。这是我在运行子进程调用后期望的words.txt
。
答案 0 :(得分: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的引用是没有必要或有用的(通常你应该避免这种情况) ,由于这个原因和其他原因)。
\<
和\>
作为字边界运算符,因此我们必须使用(功能相当的)\b
。
答案 1 :(得分:-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来试试。