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

2024-09-27 00:11:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个python脚本,它允许我动态地构建egrep-v属性,并将输出转换成更少(或更多)的内容。
我之所以要使用external egrep+less,是因为我正在处理的文件是非常大的文本文件(500MB+)。首先将它们读入一个列表,然后通过Python进行本机处理非常缓慢。

但是,当我使用操作系统或者subprocess.call,目前一切都非常缓慢,我希望退出较少的输出并返回python代码。

我的代码应该这样工作:
1。/我的less.py信息?500文本
2更少-FRX消息输出文本显示(完整文件)。
三。当我按q退出less-FRX时,python代码将接管并显示提示,提示用户输入要排除的文本。用户输入后,我将其添加到列表中
4我的python代码构建了egrep-v“exclude1”,并通过管道将输出降低到
5用户重复步骤3并输入另一个要排除的内容
6现在,我的python代码调用egrep-v“exclude1 | exclude2”消息_500文本|减-FRX
7整个过程继续进行

但是,这并不像预期的那样有效。
*在我的Mac电脑上,当用户按q退出less-FRX时,raw_input prompt会在几秒钟内显示
*在Linux机器上,我得到了大量的“egrep:writing output:breaked pipe”
*如果(仅限linux)在使用less-FRX时,按CTRL+C,出于某种原因退出less-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)

任何帮助都将不胜感激


Tags: 文件to代码用户文本内容列表command
1条回答
网友
1楼 · 发布于 2024-09-27 00:11:12

实际上,我发现了问题所在

我对在Linux上运行脚本时出现的错误做了一些研究(“egrep:writing output:brokend pipe”),这让我得到了一个答案:
问题是当我使用egrep-v'xyz'file | less时,当我退出less时,子进程仍然继续运行egrep,在大文件(500MB以上)上运行需要一段时间。

通常情况下,子进程会分别执行两个程序,并在第二个程序退出后运行第一个程序(egrep

为了正确解决我的问题,我使用如下方法:

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,我现在可以在退出less时立即终止egrep,现在我的python脚本正在运行:)

干杯,
米洛斯

相关问题 更多 >

    热门问题