2014-12-31 3 views
3

У меня возникла проблема с вызовом внешней программы из моего сценария python, в которой я хочу использовать mpi4py для распределения рабочей нагрузки между различными процессорами.Вызов подпроцесса в скрипте с использованием mpi4py

В принципе, я хочу использовать свой скрипт таким образом, чтобы каждый ядро ​​готовил некоторые входные файлы для вычислений в отдельных папках, затем запускал внешнюю программу в этой папке, ожидал выход, а затем, наконец, читал результаты и собирал их.

Однако я просто не могу заставить внешний вызов программы работать. В поисках решения этой проблемы я обнаружил, что проблемы, с которыми я сталкиваюсь, кажутся весьма фундаментальными. Следующий простой пример проясняет это:

#!/usr/bin/env python 
import subprocess 

subprocess.call(“EXTERNAL_PROGRAM”, shell=True) 
subprocess.call(“echo test”, shell=True) 

./script.py работает отлично (оба вызова работает), в то время как mpirun -np 1 ./script.py выводит только test. Существует ли какое-либо обходное решение для этой ситуации? Программа, безусловно, находится в моем PATH, но она также терпит неудачу, если я использую отмененный путь для вызова.

This SO question seems to be related, sadly there are no answers...

EDIT:

В оригинальной версии моего вопроса я не включал какой-либо код, используя mpi4py, даже если я упоминаю этот модуль в названии. Так вот более сложный пример кода:

К сожалению, я не могу предоставить более подробную информацию о внешней исполняемой EXTERNAL_PROGRAM другой, чем это приложение C++, который включен MPI. Как написано в разделе комментариев ниже, я подозреваю, что это причина (или один из резонансов), почему мой внешний вызов программы в основном игнорируется.

Обратите внимание, что я знаю, что в этой ситуации никто не может воспроизвести мою точную ситуацию. Тем не менее, я надеялся, что кто-то здесь уже столкнулся с подобными проблемами и может помочь.

Для полноты ОС ОС Ubuntu 14.04, и я использую OpenMPI 1.6.5.

+0

Почему вы используете 'mpirun' для запуска сценария python с поддержкой mpi? – jfs

+0

В моем минимальном рабочем примере я мог бы переусердствовать. Однако данный пример по-прежнему иллюстрирует основную проблему моей проблемы: я не могу вызвать определенную внешнюю программу из скрипта python, который запускается в среде MPI. Я еще не упомянул, что эта внешняя программа сама по себе поддерживает MPI, поэтому это может объяснить различное поведение, которое я испытываю при вышеупомянутых вызовах подпроцесса. – nilfisque

+1

пример кода не является полным, см. [Как создать минимальный полный пример кода] (http://stackoverflow.com/help/mcve). Как я могу (или кто-либо другой) воспроизвести вашу проблему? (укажите конкретные шаги) Я не вижу, где используется 'mpi4py'. Какова ваша среда (ОС, какая реализация mpi, версии и т. Д.)? – jfs

ответ

0

В первом примере вы могли бы быть в состоянии сделать это:

#!/usr/bin/env python 
import subprocess 

subprocess.call(“EXTERNAL_PROGRAM && echo test”, shell=True) 

Питон скрипт только облегчить вызов MPI. Вы могли бы также написать сценарий bash с командой «EXTERNAL_PROGRAM & & echo test» и mpirun скрипт bash; это было бы эквивалентно mpirunning скрипту python.

Второй пример не будет работать, если EXTERNAL_PROGRAM включен MPI. При использовании mpi4py он инициализирует MPI. Вы не можете создать другую программу MPI, как только вы инициализировали среду MPI таким образом. Вы можете появиться с помощью MPI_Comm_spawn или MPI_Comm_spawn_multiple и -up для mpirun. Для mpi4py обратитесь к Compute PI example для нереста (используйте MPI.COMM_SELF.Spawn).

 Смежные вопросы

  • Нет связанных вопросов^_^