回答问题

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

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

当错误的程序进入无限循环并不断产生输出时,我遇到了问题。由于subprocess.Popen()将输出数据存储在内存中,因此这个无限循环会很快耗尽整个内存并且程序会变慢。

一种解决方案是我可以超时运行命令。但是程序需要不同的时间才能完成。大超时,对于花费小时间并具有无限循环的程序来说,违背了拥有它的目的。

有什么简单的方法可以让命令可以产生的数据量上限为 200MB?如果超过限制命令应该被杀死。

Answers

第一:存储数据的不是subprocess.Popen(),而是“我们”和“我们的”子进程之间的管道。

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

如果你做类似的事情

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,你必须尝试用select()等复制process.communicate()的行为,并采取适当的行动。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐