【发布时间】:2018-02-28 21:29:19
【问题描述】:
我正在实现一个工作流,该工作流的一部分是调用一个 python 脚本,并在该 python 脚本中让每个等级运行一个可执行文件或 python 程序。
所以为了测试我写了一个简单的程序,但它不能正常工作。代码描述如下:
helloworld.py
from mpi4py import MPI
import sys
import subprocess
mpi_warn_on_fork = 0
size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()
for i in range(size):
if rank == i:
command = "python hello.py %d %d %s" % (rank, size, name)
subprocess.call("command", shell = True)
你好.py
import sys
print "Hello from rank = %s of %s on host %s" %(sys.argv[1], sys.argv[2], sys.argv[3])
我使用以下方法调用程序: mpirun -np 16 python helloworld.py
但是这个实现不起作用,因为在 16 个进程中只有一个分叉一个进程,mpirun 运行时会生成有关程序中使用分叉的警告消息。
有人可以推荐一些东西,这样我就可以让每个 MPI 等级都能正确执行 shell 命令。
编辑: 在 C/C++ 中实现这个想法的建议也将起作用。
【问题讨论】:
-
不要使用
shell = True;写subprocess.check_call(["python","hello.py",str(rank),str(size),name]). -
如果你在运行命令之前真的不需要对通信器进行操作,你甚至可以使用没有 MPI 库甚至 shell 脚本的 Python 来执行 MPI 程序。