如何解决Python的子进程在使用PIPE读取很长的输出时返回截断的输出
我们在 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')
输出包含呈现的 HTML 页面的 Base64 字符串。由于 Base64 对于大页面来说非常大,我注意到对于一些 HTML 页面,输出被截断并且不完整。但是,这是随机发生的,因此 Base64 可能一次对一页正确,但下次会被截断。重要的是,我目前正在使用线程(10 个线程)将 HTML 并发转换为 Base64 图像,因此这可能会在这里发挥作用。
我对此进行了详细分析,发现在底层,subprocess.run 方法使用了 _communicate 方法,而后者又使用了 os.read()从 PIPE 读取的方法。我打印了它的输出,发现它也被截断了,这就是 STDOUT 被截断的原因。完全奇怪的行为。
最后,我能够通过使用文件句柄而不是 PIPE 来解决这个问题,而且效果很好。
with open(output_filename,'w+') as out_file:
result = run(['capture',stdout=out_file,check=True)
我只是好奇为什么 PIPE 无法处理完整的输出,而且也是随机的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。