如何强制Python的打印功能输出到屏幕?
这不是禁用输出缓冲的重复- 链接的问题是尝试无缓冲输出,而这是更一般的.这个问题的最佳答案太强大或涉及到这个问题(他们不是很好的答案),这个问题可以在谷歌上找到一个相对新手.
Python的解释器默认启用输出缓冲sys.stdout吗?
如果答案是肯定的,那么禁用它的所有方法是什么?
建议到目前为止:
-u命令行开关sys.stdout在每次写入后刷新的对象PYTHONUNBUFFEREDenv varsys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)是否有任何其他方式来设置一些全局标志sys/ sys.stdout程序执行过程中?
我想用shebang 执行一个gawk脚本--re-interval."幼稚"的方法
#!/usr/bin/gawk --re-interval -f
... awk script goes here
Run Code Online (Sandbox Code Playgroud)
不起作用,因为gawk是用第一个参数调用的"--re-interval -f"(不是在空白处分开),它不明白.有解决方法吗?
当然你可以不直接调用gawk,而是将它包装成一个分割第一个参数的shell脚本,或者创建一个shell脚本,然后调用gawk并将脚本放到另一个文件中,但我想知道是否有某种方法可以做这在一个文件中.
shebang行的行为因系统而异 - 至少在Cygwin中它不会通过空格分割参数.我只关心如何在一个行为类似的系统上做到这一点; 该脚本不是便携式的.
我需要一个可直接执行的python脚本,所以我用它启动了该文件#!/usr/bin/env python.但是,我也需要无缓冲输出,所以我试过#!/usr/bin/env python -u,但是失败了python -u: no such file or directory.
我发现#/usr/bin/python -u的作品,但我需要它来获得python在PATH支持虚拟env环境.
我有什么选择?
I'm trying to understand one of the answers to this question:
Cannot pass an argument to python with "#!/usr/bin/env python"
#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
Run Code Online (Sandbox Code Playgroud)
This works well, but I do not understand why it works with four ticks at the beginning of that line rather than three.
In addition, why the hash near the end of that string?
我想编写一个读取stdin(无缓冲)的程序,并编写stdout(unbuffered)进行一些简单的char-by-char转换.为了举例说明,我想要x从stdin中删除所有字符.
可能重复:
如何刷新Python打印输出?
python中的无缓冲的stdout(如在python -u中)来自程序内部
我有以下代码来刷新输出缓冲区.
print 'return 1'
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
我可以设置打印功能,以便在调用时自动刷新缓冲区吗?
我有一个执行大量处理的Django管理命令,因此我将其进度输出为一个百分比。我想使用此处或此处答案中所述的技术。我从Django文档中知道,在管理命令中使用Django时sys.stdout需要将其替换self.stdout,但是我仍然没有运气。它是python 2.7,所以我不能将endkwarg设置为print。这是我尝试过handle的Command对象之一:
i = 0
for thing in query:
self.stdout.write("\r%%%s" % (100 * float(i) / float(query.count()))
i += 1
Run Code Online (Sandbox Code Playgroud)
我已经尝试过在回答类似问题时描述的其他几种技术,包括使用ANSI转义序列。Django管理命令打印输出的方式有什么特别之处吗?如何获得想要的效果?
我在后台运行python脚本,但为什么它仍然打印到控制台,即使用管道传输到文件?
我尝试了以下命令:
python script.py &
python script.py > output.txt &
Run Code Online (Sandbox Code Playgroud)
我尝试了一个简单的脚本:
print "hello world"
Run Code Online (Sandbox Code Playgroud)
同
python script.py &
Run Code Online (Sandbox Code Playgroud)
它仍然打印到控制台.
但
python script.py > output.txt &
Run Code Online (Sandbox Code Playgroud)
按预期工作,不打印到控制台.
我需要在使用构建构建的脚本中使用无缓冲的输出。
-u我的方法是在生成的脚本中指定Python 的标志。
这是我的 buildout.cfg:
[buildout]
parts = python
develop = .
[python]
recipe = zc.recipe.egg:scripts
eggs = myproject
Run Code Online (Sandbox Code Playgroud)
和setup.py:
[buildout]
parts = python
develop = .
[python]
recipe = zc.recipe.egg:scripts
eggs = myproject
Run Code Online (Sandbox Code Playgroud)
我得到以下配置的 shebang:
from setuptools import setup, find_packages
setup(
name = 'myproject',
packages = find_packages(),
entry_points = """
[console_scripts]
myscript = myproject:main
""",
)
Run Code Online (Sandbox Code Playgroud)
我想要这个:
$ pip install .
$ head -n1 /usr/local/bin/myscript
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
怎么做?我尝试添加arguments = -u和interpreter = python -u到buildout.cfg. …
我有一个一直在使用的Py3.x GUI应用程序Gooey。该应用程序功能齐全,并且GUI可以按预期工作,但内置控制台/终端接收缓冲的输出除外。
如果我使用来运行.py文件,这不是问题pythonw -u script.py,但是我现在尝试将工具捆绑/冻结到中.app。捆绑过程一直有效,但是在打开应用程序时仍然存在缓冲输出的问题。
到目前为止,我发现了以下内容,但没有尝试过:
一些线程建议在每次调用时使用flush=Truewith print()进行写操作,但是logging-我在这里感兴趣的是-没有这样的互补标志。因此,该线程中的各种猴子修补解决方案对我也没有用(需要注意的是,我对logging井的内部结构并不了解,因此也许对记录器Gooey本身也可以应用类似的方法,并且打包过程输出的日志记录信息比我自己的调用要多得多,并且仍在缓冲中,因此看来“全局取消缓冲”才是真正需要的。
该线程提供了许多方法。确实,建议sys.stdout使用0缓冲区大小的重新打开方法,但是在第一个线程中,根据PIP 3116以及在我看来,使用PIP 3116,它是否仍然可以在Python 3上使用还存在争议。
nonbuffered_stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
sys.stdout = nonbuffered_stdout
Run Code Online (Sandbox Code Playgroud)
似乎.app完全打破了。
尝试将“ a” -u或PYTHONUNBUFFERED=1“ shebang ”“注入” ,无论是否带有,都似乎不起作用(在本例中为MacOS)-S。
python3 -u?我仍在尝试将MWE gooey组合在一起,但是结合使用打包过程会使这变得有些困难。