【问题标题】:Python Subprocess with Complex Command具有复杂命令的 Python 子进程
【发布时间】:2016-04-26 15:32:53
【问题描述】:

这个问题源于我对UNIX命令结构和SUBPROCESS模块的了解不足,所以请提前原谅我的幼稚。

我有一个命令,看起来像这样

path/to/openmpi/mpirun -machinefile machine.file -np 256 /path/to/excecutable </dev/null &> output.out &

我知道 MPIrun 的结构是如何工作的,并且我认为我的可执行文件将其数据写入标准输出,然后我将其重定向到一个名为 output.out 的文件。我已经在使用 os.sys() 的 python 脚本中使用了这个命令,但我想使用子进程,以便当可执行文件完成运行(在后台)时,python 脚本可以继续做“事情”。

我不知道从哪里开始,所以如果有人有任何提示或可以告诉我格式化子进程命令的正确方法,我将非常感激。所有使用子流程的个人尝试都会导致失败。

谢谢!!!

【问题讨论】:

    标签: python python-2.7 subprocess mpi os.system


    【解决方案1】:

    这很简单。

    from subprocess import call
    call(["path/to/openmpi/mpirun", "-machinefile machine.file -np 256 /path/to/excecutable </dev/null &> output.out &"])
    

    通常,您会将命令的参数作为列表提供,但我认为这应该也可以。如果不是,则将每个参数分解为列表的一个新元素。

    This 的回答更多地说明了这种方法的局限性。

    【讨论】:

    • 我认为这行得通,但是我该如何让子进程等待可执行文件完成其任务,然后再进行其他操作?在这种情况下,子进程不会认为它一发出命令就完成了吗?
    • 来自 Python 文档:subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) "运行 args 描述的命令。等待命令完成,然后返回 returncode 属性。"所以它应该等待,我相信。