使用子进程在Python中运行顺序命令

时间:2018-02-10 15:12:51

标签: python docker subprocess fenics

希望你能提供帮助。在我的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())

但它没有做任何事情。建议?

2 个答案:

答案 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"