Source code for dbprocessing.module
"""
Wrapper for environment modules script (http://modules.sourceforge.net).
as used on the LANL scheme
"""
from __future__ import print_function
import os
import re
import subprocess
[docs]class module(object):
"""Support for using/loading environment modules"""
[docs] def __init__(self, *args):
"""
Commands are entered as args to this class then parsed
Parameters
----------
args : :class:`list` of :class:`str`
Arguments passed straight through to module
Examples
--------
>>> mod = module('load', 'icy')
"""
self.env = os.environ.copy()
"""Environment variables (:class:`dict`)"""
command = "modulecmd python "+' '.join(args)
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
retval = p.communicate()
self._parse(retval)
def _parse(self, inval):
"""
Parse the module call and updates environment.
Makes changes to :data:`env`.
Parameters
----------
inval : :class:`str`
Output of module call
"""
regex = re.compile(r'^os\.environ\[(.*)\]$')
for val in inval:
if val is None:
continue
# split on \n
cmd = val.split('\n')
for v2 in cmd:
if not v2:
continue
dict_call, pth = v2.split(' = ')
m = re.match(regex, dict_call)
if m:
key = m.groups()[0]
self.env[key] = pth
[docs] @classmethod
def get_env(self, *args):
"""
Return a complete environment.
Parameters
----------
args : :class:`list` of :class:`str`
Arguments to pass direction to module command.
Returns
-------
:class:`dict`
Environment variables, starting with current environment and
modified by the module commands. Suitable as ``env`` argument
in :func:`subprocess.call`.
"""
m = module(*args)
return m.env