我正在尝试使用子进程库从我的 Python 模块运行 grep 命令。由于我正在对文档文件执行此操作,因此我正在使用Catdoc第三方库来获取计划文本文件中的内容。我想将内容存储在文件中。我不知道我哪里出错了,但程序无法生成纯文本文件并最终获得 grep 结果。我已经浏览了错误日志,但它是空的。感谢您的所有帮助。
def search_file(name, keyword):
#Extract and save the text from doc file
catdoc_cmd = ['catdoc', '-w' , name, '>', 'testing.txt']
catdoc_process = subprocess.Popen(catdoc_cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
output = catdoc_process.communicate()[0]
grep_cmd = []
#Search the keyword through the text file
grep_cmd.extend(['grep', '%s' %keyword , 'testing.txt'])
print grep_cmd
p = subprocess.Popen(grep_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
stdoutdata = p.communicate()[0]
print stdoutdata
在 UNIX 上,指定shell=True
将导致第一个参数被视为要执行的命令,所有后续参数都被视为 shell 本身的参数。因此,>
不会有任何影响(因为对于/bin/sh -c
,命令后的所有参数都被忽略)。
因此,您实际上应该使用
catdoc_cmd = ['catdoc -w "%s" > testing.txt' % name]
不过,更好的解决方案可能是从子进程的stdout
中读取文本,并使用re
或Python字符串操作对其进行处理:
catdoc_cmd = ['catdoc', '-w' , name]
catdoc_process = subprocess.Popen(catdoc_cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
for line in catdoc_process.stdout:
if keyword in line:
print line.strip()
您正在尝试将>传递给 shell,但这不会像您那样工作。如果你想生成一个进程,你应该安排它的标准输出被重定向。幸运的是,这真的很容易做到;您所要做的就是打开您希望输出进入写入的文件,并使用 stdout 关键字参数将其传递给 popen,而不是 PIPE,这会导致它附加到您可以使用 communication() 读取的管道。