Запуск последовательных команд в Python с подпроцессом

Надеюсь, ты сможешь помочь. В моем скрипте Python мне нужно запустить программный контейнер Docker с определенным образом (в моем случае это Fenics), а затем передать ему команду на выполнение скрипта.

Я пробовал с подпроцессом:

   cmd1 = 'docker exec -ti -u fenics name_of_my_container /bin/bash -l'
    cmd2 = 'python2 shared/script_to_be_executed.py'
    process = subprocess.Popen(shlex.split(cmd1), 
              stdout=subprocess.PIPE,stdin=subprocess.PIPE, stderr = 
              subprocess.PIPE)
    process.stdin.write(cmd2)
    print(first_process.stdout.read())

Но это ничего не делает. Предложения?

1 ответ

Решение

Брось -it флаги в твоем звонке делают dockerВы не хотите их. Кроме того, не пытайтесь отправить команду для выполнения в контейнер через stdin, а просто передайте команду для запуска в вашем вызове do docker exec,

У меня не работает контейнер, поэтому я буду использовать docker run вместо этого, но код ниже должен дать вам подсказку:

import subprocess
cmd = 'docker run python:3.6.4-jessie python -c print("hello")'.split()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, err = p.communicate()
print(out)

Это будет работать python -c print("hello") в контейнере и перехватите вывод, поэтому скрипт Python (3.6) сам распечатает

b'hello\n'

Это также будет работать в Python 2.7, я не знаю, какую версию вы используете на хост-машине:)

Что касается связи с подпроцессом, обратитесь к официальному документу subprocess.Popen.communicate. Начиная с Python 3.5 есть также subprocess.run, который делает вашу жизнь еще проще.

НТН!

Вы можете использовать подпроцесс для вызова Fenics как приложения, раздел 4.4 здесь.

docker run --rm -v $(pwd):/home/fenics/shared -w /home/fenics/shared quay.io/fenicsproject/stable "python3 my-code.py"
Другие вопросы по тегам