在python脚本中加载环境模块

时间:2011-03-24 23:54:30

标签: python module environment-variables environment-modules

有没有办法让python脚本加载和使用environment modulesos.system('module load xxx')不起作用,因为它在子shell中执行它们(至少,我认为这是正在发生的事情)。

4 个答案:

答案 0 :(得分:17)

我知道这个问题有点陈旧,但它仍然具有足够的意义,我正在寻找答案,所以我发布的内容也是如此:

至少在3.2.9+源代码中,你可以包含python“init”文件来获取模块的python函数版本:

>>> execfile('/usr/local/Modules/default/init/python.py')
>>> 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

答案 1 :(得分:4)

我们的一位管理员能够使用对os.popen()的{​​{1}}来电来解决问题:

modulecmd

答案 2 :(得分:0)

不是直接的,但这是一种可能的解决方法,具体取决于您的环境。假设您可以使用ENVVAR=value作为系统命令的序言,您可以按照这些方式执行操作:

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

代码将 vi 分配给您的EDITOR环境变量,然后在命令行上传递它并运行命令(在本例中为编辑器)。

答案 3 :(得分:0)

虽然接受的解决方案有效,但我发现编写起来更容易:

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')

这对我来说看起来更pythonic,也允许IDE提供自动完成等功能。