首页 > 解决方案 > 使用 python 调用脚本后,对 mpirun 的 os.system() 调用不起作用

问题描述

我正在尝试在已经通过控制台、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之后调用并且由于这种“阻塞”而无法调用。pythonos.systemmpirun

如果是这样,有没有办法绕过这个选项?

标签: python-3.xparallel-processingmpimpi4py

解决方案


在我的环境(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')

似乎您不需要在命令行中提供模块 mpi4py,因为您将它导入到 parallel.py 文件中。另外,我删除了 -v 选项,这增加了很多冗长。


推荐阅读