首页 > 解决方案 > 执行 Python subprocess.run 继续调用外部 MPIRUN 命令

问题描述

在使用subprocess.run() 从 python 进行外部调用期间,我在一个名为 ORCA 的程序中遇到了一个隐藏的 MPIRUN 调用的小问题。我将不胜感激一些帮助故障排除。

我在 Windows 10 上的 Jupyter Notebook 6.0.3 中使用 Python 3.8.3。我的工作流执行从 python 到 ORCA orca.exe 程序的外部调用,使用:

fileHandler = open(outputFileStr, "w")
result = subprocess.run([orcaLocationStr, inputFileStr], cwd=cwdStr, shell=True, stdout=fileHandler)

注意:我试过调整subprocess.run()参数,你看到的只是许多迭代中的一个。我认为我面临的基本问题是我在下面描述的问题。

外部调用必须重新创建 Windows 命令终端调用:

c:\ORCA\orca my_inputfile.inp

(注意:如果我从终端执行 ORCA,我会添加> output.out。但是,通过 python,我已将输出重定向到文件)。

变量orcaLocationStr包含c:\ORCA\orca. 需要 orca.exe 的绝对路径(即使它在您的 PATH 环境变量中)才能使用其多处理功能。

该变量inputFileStr指向一个包含 ORCA 所需参数的文件。这些参数之一是进程的数量,例如nproc 16

一切都很顺利,直到 ORCA 崩溃。orca.exe 原来是 ORCA 主目录中其他几个 .exe 文件的包装器。使用了我之前提到的nproc参数,因此 orca.exe 包装器可以n使用mpirun. 那是在 Python 中执行 orca.exe 崩溃并返回非零值时。我知道这已经执行了一些基本检查:

在 ORCA 参数文件中指定的N 个进程。调用MPIRUN。

  1. 该命令将使用N进程从 Windows 命令行执行。
  2. 使用 subprocess.run() 从 Python 执行时,该命令失败。

在 ORCA 参数文件中指定了1 个进程。不调用 MPIRUN

  1. 该命令将使用 1 个进程从 Windows 命令行执行。
  2. 该命令将使用 subprocess.run() 从 Python 执行。

我认为重要的是要清楚,不是 Python 执行 MPIRUN。它是由 Python 调用的执行 MPIRUN 的外部二进制文件。

如何通过外部嵌入的 MPIRUN 调用使 Python 进程准备好接受多个子进程?

编辑#1我希望我的软件 (a) 执行所有预处理步骤,例如执行 IO 任务等,然后 (b) 我想使用 subprocess.run() 1600 次 - 因为我有 1600 个输入文件要执行。我想知道是否所有其他方法都失败了,是否仅将这部分移至 Bash 之类的东西并独立于 Python 执行。

标签: pythonjupyter-notebooksubprocessmpi

解决方案


推荐阅读