Есть ли способ для скрипта Python загружать и использовать модули среды? os.system('module load xxx') не работает, поскольку выполняет их в подоболочке (по крайней мере, я так думаю).
Загрузка модулей среды в скрипт Python
Ответы (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.
popen вызовы modulecmd находятся в файле python.py, который вы процитировали), поэтому я установлю это как ответ. Спасибо!
- person marshall.ward; 20.08.2013
Один из наших администраторов смог решить проблему за меня, используя os.popen() обращения к modulecmd:
cmd = os.popen('/path/to/modulecmd python load my-module')
exec(cmd)
Хотя принятое решение работает, мне было проще написать:
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 предлагать автозаполнение и т. д.
Не напрямую, но вот один из возможных обходных путей, в зависимости от вашей среды. Предполагая, что вы можете предварить свою системную команду ENVVAR=value, вы можете сделать что-то в этом роде:
import os
os.environ['EDITOR'] = 'vi'
cmd = "EDITOR=%(EDITOR)s $EDITOR" % os.environ
os.system(cmd)
Код присваивает vi переменной окружения EDITOR, затем передает ее в командной строке и запускает команду (в данном случае) EDITOR.