在Docker Compose管理的Docker容器内运行的Python应用程序中使用print()
语句时,只记录sys.stderr
输出。香草print()
语句不可见,因此:
print("Hello? Anyone there?")
...从未出现在常规日志中:
(您可以在我的应用程序中看到其他库显式打印的其他日志,但没有我自己的调用。)
如何避免我的print()
调用被忽略?
使用pytest
,我的解决方案是添加-s
选项。
例如,在我还需要启用详细模式的场景中,我必须将pytest-sv
。
很简单,如果你在Dockerfile的行中添加选项-u,它将打印你的日志:
CMD ["python", "-u", "my_python_script.py"]
无需更改环境变量或更改程序的所有打印语句。
默认情况下,Python将输出缓冲到sys.stdout
。
有几个选择:
1.调用显式flush
重构原始打印语句以包含flush=True
关键字,如:
print("Hello? Anyone there?", flush=True)
注意:这将导致整个缓冲区刷新,而不仅仅是同一个打印调用。因此,如果在其他地方(即没有flush=True
)存在未明确取消缓冲的“裸”打印函数调用,这些函数调用也将始终被刷新。
您可以通过以下方式实现相同的目标:
import sys
sys.stdout.flush()
如果您希望最大限度地控制冲洗何时发生,此选项非常有用。
2.通过PYTHONUNBUFFERED
env var取消整个应用程序的缓冲区
将以下内容放入docker compose.yml
文件的environment
部分:
pythononbuffered:1
这将导致立即刷新stdout
的所有输出。
3.使用-u
与上面的选项#2一样,这将导致Python在应用的整个执行生命周期中运行“无缓冲”。用python-u运行即可
我有一个flask应用程序,只有一条路线,没有复杂的事情发生,运行在docker容器中。我一辈子都不能让print语句出现在日志中(
问题内容: 我用来在Python脚本中运行git命令。 这似乎按预期工作。但是,在Django模板中使用会给出。我尝试使用来查看此字符串中的字符,但无济于事: 事实证明,返回的命令具有属性: 如何获取没有转义符的字符串?从Bash运行命令很好: 问题答案: 在REPL中将不会打印它,而是显示它。使用让你在找什么。 如果您不希望使用任何转义代码,请考虑使用-在stdout不是tty的情况下执行它,大
本文向大家介绍OCaml 从标准输入读取并打印到标准输出,包括了OCaml 从标准输入读取并打印到标准输出的使用技巧和注意事项,需要的朋友参考一下 示例 我们准备一个包含reverser.ml以下内容的文件: 然后,我们使用以下命令编译程序: 我们通过将数据传递到新的可执行文件进行测试: 该reserver.ml程序以命令式风格编写。虽然命令式样式很好,但是将其与功能翻译进行比较很有趣: 由于引入
问题内容: 在Python 3.3中,打印时是否有任何方法可以使字符串下标中的文本成为一部分? 例如H 2(H然后是下标2) 问题答案: 如果您只关心数字,则可以使用和方法: 请注意,这在Python 2中不起作用-请参见Python 2 maketrans()函数与Unicode不兼容,以获取有关为何如此以及如何解决此问题的解释。
在我的项目中,客户需要使用POS打印机打印收据,这可以使用JAVA POS来完成。我在网上搜索没有任何有用的材料,但发现 1.javapos 2.jpos 可以有人请指导我应该进行JAVA POS或JPOS。 该应用程序基于Java Swing desktop而不是基于web。 真的坚持这一点,任何帮助都是非常有用的
要修补三星和wiko设备上的一些崩溃,我必须在发布模式下在设备上运行我的应用程序。但我想看到。 我该怎么办?