PyInstaller 无缓冲的标准输入输出流

10

问题

Docker镜像大小通常应尽可能小。使用完整的环境,例如标准Python镜像,在安装所有依赖项后会导致显着膨胀的镜像。将Python打包成独立的可执行文件(例如使用pyinstaller)是减小镜像大小和整体复杂性的完美方法。

环境: python3.6, pyinstaller==3.4

出现的问题是,Python默认使用缓冲stdio。这可以通过使用python -u ...运行Python脚本来缓解。但是在使用pyinstaller时变得无法访问。

根据文档,应该可以添加运行时选项,例如uvW...到生成的可执行文件中。但不幸的是,在实际情况中似乎不起作用。虽然vW都正常工作,但u似乎被完全忽略了。

以下代码段显示了用法:

...
exe = EXE(...
          [('u', None, 'OPTION')],
          name="myapp",
          ...)
...

这面旗帜仍然有效吗?由于其他的工作 - 它已经被删除了,但没有通知或更新文档吗?

有没有其他方法可以禁用stdio缓冲(使用pyinstaller或外部方式),而不需要修改Python代码,就像这样

为什么需要这样做?

在运行Docker Swarm服务时应避免使用缓冲IO。为了使可执行文件实时记录到Docker守护程序中,需要附加一个shell。但是向Swarm任务附加tty shell会使日志处理变得更加复杂,甚至可能无法正常工作。

2个回答

0

这个拉取请求修复了问题。

'-u'选项将设置Py_UnbufferedStdioFlag标志,以在Python库中启用无缓冲stdio模式。

这个文档展示了如何使用spec文件启用运行时选项。

options = [ ('u', None, 'OPTION') ]
a = Analysis( ...
        )
...
exe = EXE(pyz,
  a.scripts,
  options,   <--- added line
  exclude_binaries=...
  )

注意:

这将在所有支持的Python版本中启用无缓冲的二进制stdout和stderr流,而无缓冲的文本层需要Python 3.7或更高版本。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接