Python 子进程库:从 Python 运行 grep 命令



我正在尝试使用子进程库从我的 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() 读取的管道。

相关内容

  • 没有找到相关文章

最新更新