我有两个python脚本,一个正在使用os模块在另一个脚本中使用mpi执行。这两个脚本的内容如下所示。让x包是制造麻烦的包,abc包是随机的包。我添加了命令"type mpirun“和"mpirun主机名”,以显示正在发生的变化。
runscript.py:
import os
# importing a normal package abc
import abc
os.system("type mpirun")
os.system("mpirun hostname")
os.system("mpirun -n 5 python hello.py")
# importing package x
import x
os.system("type mpirun")
os.system("mpirun hostname")
os.system("mpirun -n 5 python hello.py")hello.py:
from mpi4py import MPI
import x
comm = MPI.COMM_WORLD
print(comm.rank)命令"python runscript.py“的输出:
mpirun is /home/pavan/packages/openmpi-4.0.7/opt-gfortran/bin/mpirun
skynet
skynet
skynet
skynet
skynet
skynet
skynet
skynet
skynet
skynet
2
3
4
1
0
mpirun is /home/pavan/packages/openmpi-4.0.7/opt-gfortran/bin/mpirun在输出中可以看到,如果我导入特定的包,“”不会打印任何内容,hello.py脚本也不会被执行,但是"type mpirun“将打印openmpi的相同位置。我不知道为什么导入特定的包会导致这个问题。当我导入一个随机包abc时,不会发生这种情况。
另外,请注意,由mpirun执行的脚本也导入了特定的包x,但是脚本被正确执行。这个问题只发生在runscript.py中。
任何对这个奇怪错误的帮助都将不胜感激!另外,当“”命令没有输出任何内容时,意味着什么?
发布于 2022-08-28 03:57:32
我怀疑根本原因是包x imports MPI (从mpi4py)。
在幕后,这意味着您的程序首先开始作为一个顺序程序,因此它是有效的system("mpirun ...")。
一旦导入了MPI (通过包x间接导入),runscript.py就变成了MPI单例,不再允许“`system”(“mpirun.”)。
在import x之前,可以插入以下行
import mpi4py
mpi4py.rc.initialize=False
mpi4py.rc.finalize=False看看是否有用。
请注意,这对我来说适用于一个简单的测试,但是如果它(间接地)发出诸如访问x之类的MPI调用,它将“破坏”包MPI.COMM_WORLD.rank。
下面的程序说明了这一点。
import os
os.system("mpirun -n 1 hostname")
print('after mpi4py')
# make sure `MPI_Init()` is not invoked under the hood
import mpi4py
mpi4py.rc.initialize=False
mpi4py.rc.finalize=False
from mpi4py import MPI
# since `mpi4py` was not initialized, the following call will crash the program if uncommented
#print(MPI.COMM_WORLD.rank)
os.system("mpirun -n 1 hostname")https://stackoverflow.com/questions/73515776
复制相似问题