У меня проблемы с отображением вывода команды, запущенной с подпроцессом Python. Открыто в контейнере Docker. Терминал просто зависает во время работы процесса и только в конце выводит вывод.
У меня есть скрипт 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.
EDIT :
Таким образом, проблема в том, что команда «run» зависает и не возвращается, пока не завершится процесс контейнера.
Я нашел способ заставить его работать, запустив контейнер в отдельном режиме:
- Добавлен флаг -u в шебанге
- Обновлена функция
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))