我尝试过子进程:
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())
但它没有做任何事情。建议?
答案 0 :(得分:1)
将-it
标记放入您的docker
来电中,您不需要它们。此外,不要尝试通过stdin将命令发送到容器中,但只需将命令传递给您的呼叫执行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也会让你的生活变得更加轻松。
HTH!
答案 1 :(得分:0)
您可以使用子进程将Fenics作为应用程序调用,第4.4 here节。
docker run --rm -v $(pwd):/home/fenics/shared -w /home/fenics/shared quay.io/fenicsproject/stable "python3 my-code.py"