PythonPopen.Communications()内存限制的替代品?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (64)

我有以下Python代码块(运行v2.7),导致在MemoryError处理大型(几GB)文件时引发异常:

myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
myStdout, myStderr = myProcess.communicate()
sys.stdout.write(myStdout)
if myStderr:
    sys.stderr.write(myStderr)

在阅读文档时Popen.communicate(),似乎有一些缓冲在进行:

注意读取的数据会缓存在内存中,因此如果数据量较大或无限制,请不要使用此方法。

有没有一种方法来禁用此缓冲,或者强制缓存在进程运行时定期清除?

我应该在Python中使用什么替代方法来运行将数据流传输到千兆字节的命令stdout

我应该注意到我需要处理输出和错误流。

提问于
用户回答回答于

我想我找到了一个解决办法:

myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
for ln in myProcess.stdout:
    sys.stdout.write(ln)
for ln in myProcess.stderr:
    sys.stderr.write(ln)
用户回答回答于

如果我需要读取如此大的标准输出,我可能会做的是,在创建流程时将其发送到一个文件中。

with open(my_large_output_path, 'w') as fo:
    with open(my_large_error_path, 'w') as fe:
        myProcess = Popen(myCmd, shell=True, stdout=fo, stderr=fe)

扫码关注云+社区

领取腾讯云代金券