24

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

4

4 回答 4

22

我知道这个问题有点老了,但它仍然足够相关,我一直在寻找答案,所以我发布了我发现也有效的内容:

至少在 3.2.9+ 源代码中,您可以包含 python "init" 文件以获取模块的 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 或更高版本的环境模块,因为这是第一个具有 Python init 文件的无错误 Python3 兼容版本的版本。

于 2013-08-19T23:17:11.487 回答
4

我们的一位管理员能够使用以下os.popen()电话为我解决问题modulecmd

cmd = os.popen('/path/to/modulecmd python load my-module')
exec(cmd)
于 2011-03-25T06:32:19.450 回答
2

虽然公认的解决方案有效,但我发现它更容易编写:

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)
from python import module

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

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

于 2020-11-18T08:10:07.297 回答
0

不是直接的,但这是一种可能的解决方法,具体取决于您的环境。假设您可以在系统命令前加上ENVVAR=value,您可以按照以下方式执行操作:

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

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

于 2011-03-25T03:42:54.317 回答