调用外部egrep时子进程非常慢而

时间:2015-05-05 09:23:03

标签: python grep less subprocess

我正在尝试构建一个python脚本,它允许我动态构建 egrep -v 属性并将输出管道化为更少(或更多)。
我想使用外部egrep + less的原因是因为我正在处理的文件是非常大的文本文件(500MB +)。首先将它们读入列表并通过Python本地处理非常慢。

但是,当我使用os.system或subprocess.call时,一切都非常慢,此时我想退出较少的输出并返回到python代码。

我的代码应该像这样工作:
1 ./myless.py messages_500MB.txt
2.显示messages_500MB.txt的较少-FRX输出(完整文件) 3.当我按下' q'要退出较少的-FRX,python代码应该接管并显示提示,以便用户输入要排除的文本。用户输入它并将其添加到列表中 我的python代码构建了egrep -v' exclude1'并将输出管道减少为
5.用户重复步骤3并输入另一个要排除的东西 6.现在我的python代码调用egrep -v' exclude1 | exclude2' messages_500MB.txt |少-FRX
7.过程继续

但是,这不能按预期工作 *在我的Mac上,当用户按q退出较少的-FRX时,显示raw_input提示需要几秒钟的时间 *在Linux机器上,我得到了大量的egrep:写输出:断管'
*如果,(仅限Linux)在较少的-FRX中,我按CTRL + C,由于某种原因退出较少的-FRX变得快得多(按预期)。在Mac上,我的python程序中断了

这是我的代码示例:

excluded = list()
myInput = ''
while myInput != 'q':
    grepText = '|'.join(excluded)
    if grepText == '':
        command = 'egrep "" ' + file + ' | less -FRX'
    else:
        command = 'egrep -v "' + grepText + '" ' + file + ' | less -FRX'

    subprocess.call(command, shell=True)
    myInput = raw_input('Enter text to exclude, q to exit, # to see what is excluded: ')
    excluded.append(myInput)

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

实际上我弄清楚问题是什么

我做了一些关于在Linux上运行我的脚本时可见的错误的研究(“ egrep:写输出:断管”)并引导我得到答案:
问题是我何时使用egrep -v'xyz'文件|更少,当我退出时,子进程仍然继续运行egrep和大文件(500MB +)这需要一段时间。

很明显,子进程分别执行两个程序并运行第一个程序( egrep ),即使在第二个程序( less )退出后也是如此
为了妥善解决我的问题,我使用类似的东西:

command = 'egrep -v "something" <filename>'
cmd2 = ('less', '-FRX') 
egrep = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
subprocess.check_call(cmd2, stdin=egrep.stdout)
egrep.terminate()

通过将第一个进程输出到第二个进程stdin,我现在能够在退出时立即终止egrep,现在我的python脚本正在飞行:)
干杯,
米洛斯