强制无缓冲输出用于使用buildout和zc.recipe.egg:scripts制作的脚本

5 投票
1 回答
1502 浏览
提问于 2025-04-16 14:28

我需要在一个使用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 = -uinterpreter = 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 的相关内容。

撰写回答