我在显示使用docker容器中的Python subprocess.Popen运行的命令的输出时遇到问题。终端仅在进程运行时挂起,直到最后才打印输出。 我有这样的Python脚本(简化):
def test():
print('start')
process = subprocess.Popen('pytest', stdout=subprocess.PIPE, universal_newlines=True)
for line in iter(process.stdout.readline, ''):
print(">>> {}".format(line.rstrip()))
def docker():
client = docker.from_env()
command = './this_script --test'
generator = client.containers.run('python:3', command, remove=True, init=True, working_dir='/test', stdout=True, stderr=True, stream=True)
for log in generator:
print('>>> {}'.format(log))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
...
# if called with --test, the script calls test()
# if called with --docker, the script calls docker()
print('start')
开头的test()
直到处理结束才打印。
如何强制子进程的标准输出实时显示?
我在Ubuntu 18.04上,使用Python 3.6.7,Docker版本18.09.6,内部版本481bc77。
编辑: 因此,问题在于“运行”命令挂起,直到容器进程结束后才返回。 我找到了一种在分离模式下运行容器的方法:
docker()
函数,以分离模式启动容器:def docker():
client = docker.from_env()
command = 'python -u this_script.py --test'
generator = client.containers.run('python:3', command, remove=True, init=True, working_dir='/test', detach=True)
for log in generator.logs(stdout=True, stderr=True, stream=True):
print('>>> {}'.format(log))