Загрузка модулей среды на кластере из моего скрипта Python - PullRequest
0 голосов
/ 10 января 2019

Мне нужно отправить работу Python на сервер. Пока он работает, мне нужно загружать и выгружать модули во время работы, поскольку он вызывает несколько программ, каждая из которых имеет различные зависимости, которые конфликтуют, то есть gcc и intel.

Этот вопрос задавался ранее, но ответы в этой ситуации мне не помогли

Загрузка модулей среды в скрипте Python

погрузо-среда-модули-в-питон-скрипт

Я пытался использовать

import subprocess as sub
cmd = 'module load intel/2016.4'
p = sub.Popen(cmd, shell=True, stderr = sub.STDOUT, stdout = sub.PIPE).communicate()[0] 
print(p.decode()) # this simply outputs to screen

И на выходе говорится, что модули были переключены.

Lmod is automatically replacing "gcc/5.4.0" with "intel/2016.4".

Due to MODULEPATH changes, the following have been reloaded:
  1) openmpi/2.1.1

Однако, когда я делаю «список модулей» с терминала, модули не переключались. gcc/5.4.0 все еще загружен. Также программа, требующая intel/2016.4, не запускается. Например, позже я хочу иметь возможность использовать версию gromacs, которая требует intel/2016.4, и она не работает.

Я немного сбит с толку, поскольку думал, что могу использовать команды bash через Popen, а 'загрузка модуля' - это команда bash. Я не хочу писать сценарий bash для этого, в моем сценарии есть много других вещей, которые гораздо удобнее делать с python, чем bash.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

В большинстве реализаций модулей среды есть скрипт инициализации Python, который очень удобен. Для lmod он находится в $LMOD_DIR/../init и называется env_modules_python.py. Таким образом, вы можете сделать это:

$ export PYTHONPATH=${PYTHONPATH}:$LMOD_DIR/../init
$ python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from env_modules_python import module

и оттуда вы можете запустить любую команду 'module' непосредственно в Python.

>>> module('list')

Currently Loaded Modules:

[...]
  3) StdEnv                                             (H)
  4) GCCcore/6.4.0                                      (H)
  5) binutils/2.28-GCCcore-6.4.0                        (H)
[...]

Это изменит среду скрипта Python, и эта среда будет распространена на подоболочки.

>>> import os
>>> os.system("which icc")
which: no icc in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
256
>>> module("load intel")
>>> os.system("which icc")
/opt/[...]/icc/2017.4.196-GCC-6.4.0-2.28/compilers_and_libraries_2017.4.196/linux/bin/intel64/icc
0

То же самое работает с Popen:

>>> import subprocess as sub
>>> cmd='which icc'
>>> p = sub.Popen(cmd, shell=True, stderr = sub.STDOUT, stdout = sub.PIPE).communicate()[0]
>>> print(p.decode())
/opt/[...]icc/2017.4.196-GCC-6.4.0-2.28/compilers_and_libraries_2017.4.196/linux/bin/intel64/icc
0 голосов
/ 10 января 2019

Я недавно столкнулся с этим. Простой способ обойти это - включить зависимости перед желаемой командой и отделить их точкой с запятой

cmd = 'module load intel/2016.4; "gromacs command"'
p = sub.Popen(cmd, shell=True, stderr = sub.STDOUT, stdout = sub.PIPE).communicate()[0]

где "команда gromacs" представляет, однако, вы обычно вызывали бы gromacs. intel/2016.4 не будет отображаться в списке модулей как загруженные, если вы проверите после запуска скрипта, но gromacs будет запускаться изнутри вашего скрипта python, используя intel/2016.4, что вам и нужно.

...