Tom*_*thi 4 python python-3.x docker
我写了一个 python 程序及其 Dockerfile:
import time
print("Begin")
time.sleep(100);
print("End")
Run Code Online (Sandbox Code Playgroud)
创建了它的图像,并使用它运行docker run <image-id>,令我惊讶的行为是,在控制台中发出运行命令后,它等待 sleep(100) 秒并一起打印"Begin"和"End"。
为什么我们在运行时得不到中间结果?
另外,如果它不会在生成后立即发送数据,我该如何以这种方式编写流应用程序(在卡夫卡等中)?
当您从控制台运行 python 脚本时,它会立即在stdout上显示Begin ,因为它是一个 tty(交互式)并在每行末尾刷新。但是,如果您像这样重定向stdout和stdin,python 脚本将不会注意到它是从 tty 运行的,并且只会在完成时刷新。python /tmp/a.py < /dev/null | cat
如果您从 docker 容器运行相同的脚本,默认情况下它没有 tty,您必须明确要求一个--tty , -t Allocate a pseudo-TTY:
docker run -t yourimage
Run Code Online (Sandbox Code Playgroud)
或者,如果您不希望容器使用 tty 运行,则可以通过设置PYTHONUNBUFFERED环境变量、向 python 解释器添加-u选项或修改脚本来强制刷新发生,如下所示:
docker run -t yourimage
Run Code Online (Sandbox Code Playgroud)
或使用flush参数(仅限python3):
import sys
import time
print("Begin")
sys.stdout.flush()
time.sleep(100);
print("End")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2044 次 |
| 最近记录: |