Запуск последовательных команд в 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"