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

Есть ли способ для скрипта Python загружать и использовать модули среды? os.system('module load xxx') не работает, поскольку выполняет их в подоболочке (по крайней мере, я так думаю).


person marshall.ward    schedule 24.03.2011    source источник


Ответы (4)


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

По крайней мере, в исходниках 3.2.9+ вы можете включить файл «init» python, чтобы получить версию модуля с функцией python:

>>> exec(open('/usr/local/Modules/default/init/python.py').read())
>>> module('list')
No Modulefiles Currently Loaded.
>>> module('load','foo')
>>> module('list')
Currently Loaded Modulefiles:
  1) foo/1.0

Мне сказали, что более ранние версии могут делать то же самое без расширения .py, но это из вторых рук, так что ymmv.

Альтернативное расположение файла «init» (из комментария @lib): /usr/share/Modules/init/python.py

Для использования с Python 3 требуется версия 4.0 или более поздняя версия Environment Modules, так как это первая версия, в которой отсутствует версия файла инициализации Python, совместимая с Python3.

person jnewman    schedule 19.08.2013
comment
Это намного ближе к тому, что мы на самом деле используем (поскольку popen вызовы modulecmd находятся в файле python.py, который вы процитировали), поэтому я установлю это как ответ. Спасибо! - person marshall.ward; 20.08.2013
comment
У меня чуть инфаркт не случился, когда я это понял! Спасибо большое. - person yvesonline; 30.10.2013
comment
На сервере, который я использую, он находится в /usr/share/Modules/init/python.py. Я обнаружил, что путь запускает модуль --version (кажется, правильная запись MODULES_INIT_DIR) - person lib; 13.02.2015
comment
Круто, я нашел этот ответ в поисках решения для perl, и моя конкретная установка (ВЕРСИЯ 3.2.7 на RHEL 6.2) имеет код инициализации для нескольких оболочек в /usr/share/Modules/init/: bash, csh, ksh, perl , питон, ш, тсш и зш. Спасибо за указатель. - person Dave X; 16.12.2016
comment
execfile() устарела в python 3.6.0. Как использовать оператор exec с python 3.6 для использования модулей среды? - person srand9; 30.01.2017
comment
Спасибо @Jarvis. Ответ был обновлен для Python 3 - person jnewman; 12.06.2019

Один из наших администраторов смог решить проблему за меня, используя os.popen() обращения к modulecmd:

cmd = os.popen('/path/to/modulecmd python load my-module')
exec(cmd)
person marshall.ward    schedule 25.03.2011

Хотя принятое решение работает, мне было проще написать:

import sys
sys.path.insert(0, '/path/to/environment/modules')
# Environment modules become available by loading python.py (the name choice could be better here)
import python as mod

# ...
mod.module('use', '/some/dir')
mod.module('load', 'program/1.2.3')

Для меня это выглядит более питоническим, а также позволяет IDE предлагать автозаполнение и т. д.

person andreee    schedule 18.11.2020

Не напрямую, но вот один из возможных обходных путей, в зависимости от вашей среды. Предполагая, что вы можете предварить свою системную команду ENVVAR=value, вы можете сделать что-то в этом роде:

import os
os.environ['EDITOR'] = 'vi'
cmd = "EDITOR=%(EDITOR)s $EDITOR" % os.environ
os.system(cmd)

Код присваивает vi переменной окружения EDITOR, затем передает ее в командной строке и запускает команду (в данном случае) EDITOR.

person Jeff Bauer    schedule 25.03.2011