我在 docker 容器中更改了一个 python 文件,但它没有生效(打印不起作用)[重复]

社会演员多 pytorch 364

原文标题I changed a python file in docker container but it’s not taking effect (print not working) [duplicate]

在由 Docker Compose 管理的 Docker 容器内运行的 Python 应用程序中使用print()语句时,仅记录sys.stderr输出。没有看到香草print()语句,所以:

print("Hello? Anyone there?")

…永远不会出现在常规日志中:

enter image description here

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

如何避免我的print()电话被忽略?

原文链接:https://stackoverflow.com//questions/71901812/i-changed-a-python-file-in-docker-container-but-its-not-taking-effect-print-no

回复

我来回复
  • Lee Benson的头像
    Lee Benson 评论

    默认情况下,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部分:

    PYTHONUNBUFFERED: 1

    这将导致立即刷新所有输出 tostdout

    3.用-u运行python

    与上面的选项 #2 一样,这将导致 Python 在应用程序的整个执行生命周期内“无缓冲”运行。只需运行python -u <entrypoint.py>-不需要环境变量。

    2年前 0条评论
  • Ignacio Peletier的头像
    Ignacio Peletier 评论

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

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

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

    2年前 0条评论
  • Andrea的头像
    Andrea 评论

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

    例如,在我还需要打开详细模式的场景中,我不得不放pytest -sv

    2年前 0条评论