用于调用Unix命令的Python子进程,关于如何存储输出的问题

时间:2011-03-25 19:24:23

标签: python unix call subprocess

我正在编写一个读取行/字符串的python脚本,调用Unix,使用grep在查询文件中搜索包含该字符串的行,然后打印结果。

from subprocess import call

for line in infilelines:

    output = call(["grep", line, "path/to/query/file"])
    print output
    print line`

当我查看打印到屏幕上的结果时,我将从查询文件中获取匹配字符串的列表,但我也会得到“1”和“0”整数作为输出,line是从未打印到屏幕上。我希望从查询文件中获取与我的字符串匹配的行,然后是我在搜索中使用的字符串。

3 个答案:

答案 0 :(得分:6)

调用返回进程返回码。

如果使用Python 2.7,请使用check_output。

from subprocess import check_output
output = check_output(["grep", line, "path/to/query/file"])

如果在此之前使用任何内容,请使用沟通。

import subprocess
process = subprocess.Popen(["grep", line, "path/to/query/file"], stdout=subprocess.PIPE)
output = process.communicate()[0]

这将打开stdout的管道,你可以通过沟通阅读。如果你也想要stderr,你也需要添加“stderr = subprocess.PIPE”。

这将返回完整输出。如果要将其解析为单独的行,请使用split。

output.split('\n')

我相信Python会为你处理行结束转换,但是因为你正在使用grep我会假设你在Unix上的行结尾是\ n无论如何。

http://docs.python.org/library/subprocess.html#subprocess.check_output

答案 1 :(得分:4)

以下代码适用于Python> = 2.5:

from commands import getoutput
output = getoutput('grep %s path/to/query/file' % line)
output_list = output.splitlines()

答案 2 :(得分:0)

当Python本身可以执行此操作时,您为什么要执行对外部grep的调用?这是额外的开销,您的代码将依赖于正在安装的grep。这就是用“in”运算符在Python中执行简单grep的方法。

query=open("/path/to/query/file").readlines()
query=[ i.rstrip() for i in query ]
f=open("file")
for line in f:
    if "line" in query:
        print line.rstrip()
f.close()