强制无缓冲输出用于使用buildout和zc.recipe.egg:scripts制作的脚本
我需要在一个使用buildout构建的脚本中使用无缓冲输出。
我的做法是给生成的脚本指定Python的 -u
标志。
这是我的buildout.cfg文件:
[buildout]
parts = python
develop = .
[python]
recipe = zc.recipe.egg:scripts
eggs = myproject
还有setup.py文件:
from setuptools import setup, find_packages
setup(
name = 'myproject',
packages = find_packages(),
entry_points = """
[console_scripts]
myscript = myproject:main
""",
)
用这个配置我得到了以下的shebang:
$ pip install .
$ head -n1 /usr/local/bin/myscript
#!/usr/bin/python
而我想要的是这个:
#!/usr/bin/python -u
我该怎么做呢?我尝试在 buildout.cfg
中添加 arguments = -u
和 interpreter = python -u
,但没有成功。
1 个回答
4
你可以通过在你的Python脚本中重新打开标准输入(stdin)或标准输出(stdout)来强制使用无缓冲的输入输出。这是通过在文件编号上打开一个新的文件对象来实现的:
import io, os, sys
try:
# Python 3, open as binary, then wrap in a TextIOWrapper
unbuffered = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
except TypeError:
# Python 2
unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
如果你想使用其他模块或内置函数,这些模块或函数会用到标准输出或标准输入,你可以重新指定sys.stdout:
sys.stdout = unbuffered
另外,你也可以查看 在程序中使用无缓冲的stdout 的相关内容。