【问题标题】:os.system() calls to mpirun don't work after calling a script with python使用 python 调用脚本后,对 mpirun 的 os.system() 调用不起作用
【发布时间】:2019-11-05 15:25:13
【问题描述】:

我正在尝试在已通过控制台、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

我猜想通过在python 之后调用os.system,进程已经被“阻塞”了,而os.system 因为这个“阻塞”而无法调用mpirun

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

【问题讨论】:

  • 如果使用mpirun的绝对路径呢?
  • 我猜你的意思是“在调用 python coder.py 之后”而不是“parallel.py”
  • 用绝对路径调用也不行。但是,如果我只运行 os.system(mpirun --version) 它会给我版本,所以我不认为问题出在这一边。
  • 您可以在致电os.system() 之前尝试打印com。由于你的程序显示Done,这意味着os.system(com)被执行并返回。
  • 打印com 什么都不做。程序显示Done当然是因为它执行了,但是执行什么也没返回,这就是我要在这里解决的问题。

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


【解决方案1】:

在我的环境(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 选项,这增加了很多冗长。

【讨论】:

    【解决方案2】:

    我继续线程here。在一些建议之后,我们意识到 mpi4py 是为以前版本的 mpi 编译的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多