当前位置: 首页 > 知识库问答 >
问题:

docker compose未在Python应用程序中打印标准输出

孟修竹
2023-03-14

在Docker Compose管理的Docker容器内运行的Python应用程序中使用print()语句时,只记录sys.stderr输出。香草print()语句不可见,因此:

print("Hello? Anyone there?")

...从未出现在常规日志中:

(您可以在我的应用程序中看到其他库显式打印的其他日志,但没有我自己的调用。)

如何避免我的print()调用被忽略?

共有3个答案

锺离德庸
2023-03-14

使用pytest,我的解决方案是添加-s选项。

例如,在我还需要启用详细模式的场景中,我必须将pytest-sv

丘友樵
2023-03-14

很简单,如果你在Dockerfile的行中添加选项-u,它将打印你的日志:

CMD ["python", "-u", "my_python_script.py"]

无需更改环境变量或更改程序的所有打印语句。

能向晨
2023-03-14

默认情况下,Python将输出缓冲到sys.stdout

有几个选择:

1.调用显式flush

重构原始打印语句以包含flush=True关键字,如:

print("Hello? Anyone there?", flush=True)

注意:这将导致整个缓冲区刷新,而不仅仅是同一个打印调用。因此,如果在其他地方(即没有flush=True)存在未明确取消缓冲的“裸”打印函数调用,这些函数调用也将始终被刷新。

您可以通过以下方式实现相同的目标:

import sys
sys.stdout.flush()

如果您希望最大限度地控制冲洗何时发生,此选项非常有用。

2.通过PYTHONUNBUFFEREDenv 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设备上的一些崩溃,我必须在发布模式下在设备上运行我的应用程序。但我想看到。 我该怎么办?