Python - 限制subprocess.Popen可以生成的数据量

时间:2013-05-02 07:26:41

标签: python subprocess

我发现很多类似的问题在python中运行时询问对象的大小。一些答案建议对子流程的内存量设置限制。我不想对子进程的内存设置限制。这就是我想要的 -

我正在使用subprocess.Popen()来执行外部程序。在此过程完成后,我可以很好地获得process.stdout.readlines()process.stderr.readlines()的标准输出和错误。

当错误的程序进入无限循环并继续产生输出时,我遇到了问题。由于subprocess.Popen()将输出数据存储在内存中,因此无限循环会快速占用整个内存并减慢程序运行速度。

一个解决方案是我可以使用超时运行命令。但程序需要不同的时间来完成。对于花费很少时间并且具有无限循环的程序而言,大的超时会使得具有它的目的失败。

有没有简单的方法我可以在命令可以产生的数据量上加上200MB的上限?如果它超过限制命令就应该被杀死。

2 个答案:

答案 0 :(得分:4)

首先:它不是subprocess.Popen()存储数据,而是“我们”和“我们的”子流程之间的管道。

在这种情况下你不应该使用readlines(),因为这将无限期地缓冲数据,并且只在最后将它们作为列表返回(在这种情况下,它确实是存储数据的函数)。 / p>

如果您执行类似

的操作
bytes = lines = 0
for line in process.stdout:
    bytes += len(line)
    lines += 1
    if bytes > 200000000 or lines > 10000:
        # handle the described situation
        break

你可以在你的问题中按照自己的意愿行事。但是你不应该忘记之后杀死子进程以阻止它产生更多的数据。

但是如果你想照顾stderr,你必须尝试用process.communicate()等来复制select()的行为,并采取适当的行动。

答案 1 :(得分:1)

似乎没有一个简单的答案你想要什么

http://linux.about.com/library/cmd/blcmdl2_setrlimit.htm

rlimit有一个标志来限制内存,CPU或打开文件的数量,但显然没有任何限制I / O的数量。

您应该如上所述手动处理案例。