使用python调用脚本后,对mpirun的os.system()调用不起作用

时间:2019-06-23 17:02:31

标签: python-3.x parallel-processing mpi mpi4py

我试图在已经通过控制台,jupyter笔记本或Pycharm控制台运行的python代码上运行mpirun。所有代码运行正常,直到对mpirun进程的调用被完全跳过为止。

我创建了两个代码parallel.py,其中包含由mpirun执行的操作;和coder.py,它调用parallel.py。运行coder.py时,除调用parallel.py之外,所有关键步骤均运行。单独运行parallel.py时,代码将正常运行。

parallel.py

from mpi4py import MPI
comm = MPI.COMM_WORLD
print('RANK %s'%comm.rank)

coder.py

import os, sys
syspath = os.path.dirname(os.path.realpath(__file__))

print('Running code')
com = 'mpirun -v -np 3 ' + str(sys.executable) + " -m mpi4py " + syspath + "/parallel.py"
os.system(com)
print('Done')

致电python coder.py后:

预期

Running code
RANK 1
RANK 0
RANK 2
Done

已观察

Running code
Done

致电python parallel.py后:

RANK 1
RANK 0
RANK 2

我猜想,通过在os.system之后调用python,进程已被“阻塞”,并且由于这种“阻塞”,os.system无法调用mpirun

如果是这样,有什么办法可以规避此选项?

2 个答案:

答案 0 :(得分:0)

在我的环境(Python 2.7,MPI4Py 3.0.1和MPICH 3.2.1)上,以下代码可以正常工作:

import os
import sys
syspath = os.path.dirname(os.path.realpath(__file__))

print('Running code')
com = 'mpirun -np 3 ' + str(sys.executable) + " " + syspath + "/parallel.py"
print(com)
os.system(com)
print('Done')

当您将其导入parallel.py文件时,似乎不需要在命令行中提供模块mpi4py。另外,我删除了-v选项,该选项增加了很多细节。

答案 1 :(得分:0)

我继续执行线程here。经过一些建议,我们意识到mpi4py是为mpi的早期版本编译的。

我卸载了所有内容(计算机上所有可能的mpirun版本),以防万一,在干净的环境中重新安装了conda软件包。现在一切正常。