运行 Python 中带有子进程的顺序命令

Run sequential commands in Python with subprocess

希望对您有所帮助。在我的 Python 脚本中,我需要 运行 具有特定图像(在我的例子中是 Fenics)的软件容器 Docker,然后向他传递一个命令来执行脚本。

我试过子进程:

   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())

但它什么也没做。建议?

在您的调用中删除 -it 标志 do docker,您不需要它们。另外,不要尝试通过 stdin 将要执行的命令发送到容器中,而只是在调用 do docker exec.

时将命令传递给 运行

我没有容器 运行ning,所以我将使用 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. Since Python 3.5 there's also subprocess.run,这会让您的生活更轻松。

HTH!

您可以使用子进程将 Fenics 作为应用程序调用,第 4.4 节here

docker run --rm -v $(pwd):/home/fenics/shared -w /home/fenics/shared quay.io/fenicsproject/stable "python3 my-code.py"