Django застрял после запуска команды Docker в качестве подпроцесса
Когда я выполняю эту команду:
manim_command = f'sudo docker run --rm -v {base_dir}/manim/python_code_files:/mnt/code -v {base_dir}/media:/mnt/output manim-image manim -ql /mnt/code/user_code.py -o /mnt/output/{class_name}'
Используя subprocess.run или subprocess.Popen или os.system, он успешно запускается (создает изображение или видеофайл), но блокирует терминал и препятствует дальнейшему рендерингу шаблона.
Если файл уже присутствует, то шаблон будет успешно отрисован. Если же файла нет, то файл будет создан, но шаблон не будет отрисован.
Я пробовал запускать контейнер docker в отсоединенном режиме, но это просто отображает шаблон перед созданием файла. Очевидно, нам нужно дождаться окончания процесса:
while True:
if check_file_exists(class_name):
break
time.sleep(2)
print('File created')
Итак, он ждет, пока файл не будет создан, но когда я добавляю этот блок, он ждет, пока файл будет создан, печатает 'File created' и затем застревает прямо перед рендерингом шаблона.
почему не рендерится?
try:
# Run the function
run_manim_command(class_name)
print('function completed')
except Exception as e:
result_message = f"Error executing shell command: {e}"
#after POST request
context = {'previous_code': previous_code,
'MEDIA_URL': settings.MEDIA_URL,
'class_name':class_name,
'placeholder': False,
}
return render(request, 'run.html',context)
Он даже выводит 'function completed'
Я пробовал:
- использование потока для запуска в качестве асинхронного процесса, но результат тот же, что и при запуске в отсоединенном режиме .
- остановка и удаление контейнера. Кажется, что контейнер уже остановлен, потому что я использовал --rm. Так что же блокирует?
- Убийство подпроцесса с помощью process.kill() и process.terminate(). Эти команды выполнились без ошибок, но не разблокировали терминал.
- запускается с os.system вместо subprocess.
- Запуск без shell= True, тот же результат .