【问题标题】:Run sequential commands in Python with subprocess使用子进程在 Python 中运行顺序命令
【发布时间】:2018-02-10 15:12:50
【问题描述】:

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

但它什么也没做。有什么建议吗?

【问题讨论】:

    标签: python docker subprocess fenics


    【解决方案1】:

    在您的呼叫中删除-it 标志做docker,您不想要它们。另外,不要尝试通过标准输入将要执行的命令发送到容器中,而只需将命令传递给您的调用 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,这让您的生活更加轻松。

    HTH!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 2020-07-25
        • 2021-12-07
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2021-04-03
        • 2011-11-13
        • 2018-08-13
        相关资源
        最近更新 更多