Выполнить Python subprocess.run, который переходит к вызову внешней команды MPIRUN

#python #jupyter-notebook #subprocess #mpi

#python #jupyter-notebook #подпроцесс #mpi

Вопрос:

Я столкнулся с небольшой проблемой со скрытым вызовом MPIRUN внутри программы с именем ORCA во время внешнего вызова из python с использованием subprocess.run(). Я был бы признателен за помощь в устранении неполадок.

Я использую Python 3.8.3 в Jupyter Notebook 6.0.3 в Windows 10. Мой рабочий процесс выполняет внешний вызов из python в ORCA orca.exe программа, использующая:

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

ПРИМЕЧАНИЕ: я пробовал настраивать subprocess.run() параметры, но то, что вы видите, — это всего лишь одна итерация из многих. Я думаю, что фундаментальная проблема, с которой я сталкиваюсь, — это та, которую я описываю ниже.

Внешний вызов essential воссоздает вызов Windows command terminal:

 c:ORCAorca my_inputfile.inp
 

(Примечание: я бы добавил > output.out , если бы выполнял ORCA из терминала. Однако с помощью python я перенаправил выходные данные в файл).

Переменная orcaLocationStr содержит c:ORCAorca . Абсолютный путь к orca.exe требуется (даже если он находится в вашей переменной PATH env), чтобы использовать его возможности многопроцессорной обработки.

Переменная inputFileStr указывает на файл, содержащий параметры, требуемые ORCA. Одним из этих параметров является количество процессов, например, nproc 16 .

Все шло хорошо, пока не произошел сбой ORCA. orca.exe оказывается, это оболочка для нескольких других .exe-файлов в домашнем каталоге ORCA. nproc Параметры, о которых я упоминал ранее, используются для orca.exe оболочка может выполнять n дочерние процессы с помощью mpirun . То есть при выполнении orca.exe в Python происходит сбой и возвращается ненулевое значение. Я знаю это, выполнив некоторые базовые проверки:

N процессов, указанных в файле параметров ORCA. Вызывает MPIRUN.

  1. Команда будет выполнена из командной строки Windows с использованием N процессов.
  2. Команда завершается ошибкой при выполнении из Python с использованием subprocess.run().

1 процесс, указанный в файле параметров ORCA. Не вызывает MPIRUN.

  1. Команда будет выполнена из командной строки Windows с использованием 1 процесса.
  2. Команда будет выполнена из Python с использованием subprocess.run() .

Я думаю, важно прояснить, что это не Python, выполняющий MPIRUN. Это внешний двоичный файл, вызываемый Python, который выполняет MPIRUN.

Как я могу подготовить процесс Python к принятию нескольких дочерних процессов с помощью внешнего встроенного вызова MPIRUN?

РЕДАКТИРОВАТЬ # 1 Я ожидаю, что мое программное обеспечение (а) выполнит все этапы предварительной обработки, такие как выполнение задач ввода-вывода и т.д., Затем (б) я хочу использовать subprocess.run() 1600 раз — поскольку у меня есть 1600 входных файлов для выполнения. Мне интересно, если все остальное не удастся, следует ли переместить только эту часть на что-то вроде Bash и выполнить независимо от Python.

Комментарии:

1. некоторые реализации MPI не поддерживают задачу, непосредственно порождающую другой процесс.

2. @GillesGouaillardet Я понимаю, что это немного открытый вопрос, но как вы думаете, будет ли работать альтернатива Bash, т. Е. Если python выполнит 95% работы (подготовка файлов и т. Д.), А затем переключится на запуск Bash для выполнения ORCA? Я добавил еще пару деталей в разделе РЕДАКТИРОВАНИЕ.