我试图在已经通过控制台,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
。
如果是这样,有什么办法可以规避此选项?
答案 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软件包。现在一切正常。