繁体   English   中英

当使用 PIPE 读取非常长的输出时,Python 的子进程返回截断的 output

[英]Python's sub-process returns truncated output when using PIPE to read very long outputs

我们有一个在 NodeJS 中开发的光栅化实用程序,它将 HTML 字符串转换为呈现的 HTML 页面的 Base64。 我们使用它的方式是使用子进程模块来运行实用程序,然后使用 PIPE 读取它的 STDOUT。实现它的基本代码如下:

    from subprocess import run, PIPE
    result = run(['capture', tmp_file.name, '--type', 'jpeg'], stdout=PIPE, stderr=PIPE, check=True)
    output = result.stdout.decode('utf-8')

output 包含呈现的 HTML 页面的 Base64 字符串。 由于 Base64 对于大页面来说非常大,我注意到对于某些 HTML 页面,output 被截断并且不完整。 但是,这是随机发生的,因此 Base64 可能一次对页面正确,但下一次被截断。 重要的是要在这里提到,我目前正在使用线程(10 个线程)将 HTML 并发转换为 Base64 图像,因此它可能在这里发挥作用。

我对此进行了详细分析,发现在幕后,subprocess.run 方法使用_communicate方法,该方法又使用os.read()方法从 PIPE 中读取。我打印了它的 output 并发现它也是被截断,这就是 STDOUT 被截断的原因。 完全奇怪的行为。

最后,我能够通过使用文件句柄而不是 PIPE 来解决这个问题,并且效果很好。

with open(output_filename, 'w+') as out_file:
    result = run(['capture', tmp_file.name, '--type', 'jpeg'], stdout=out_file, stderr=PIPE, check=True)

我只是好奇为什么 PIPE 无法处理完整的 output 并且也是随机的。

当您运行子进程时,该命令将在 bash 上执行。当您使用 PIPE 作为标准输出时,内部 bash 将数据存储在临时变量中,该变量的硬限制为 128 Kb。 超过 128kb 的任何内容都会被截断。

处理大数据的最佳方法是在文件中捕获 output。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM