Pythonスクリプトが環境モジュールをロードして使用する方法はありますか?os.system('module load xxx')
サブシェルで実行されるため、機能しません(少なくとも、それが起こっていると思います)。
4 に答える
私はこの質問が古いものであることを知っていますが、それでも私が答えを探していたのに十分に関連しているので、私が見つけたものを投稿します。
少なくとも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以降の環境モジュールが必要です。これは、Python3に準拠したバージョンのPythoninitファイルを含む最初のバージョンであるためです。
os.popen()
私たちの管理者の1人は、次の呼び出しを使用して問題を解決することができました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)
from python import module
# ...
module('use', '/some/dir')
module('load', 'program/1.2.3')
これは私にはよりPythonのように見え、IDEがオートコンプリートなどを提供できるようにします。
直接ではありませんが、環境に応じて、考えられる回避策が1つあります。システムコマンドの前にを付けることができると仮定するとENVVAR=value
、次の行に沿って何かを行うことができます。
import os
os.environ['EDITOR'] = 'vi'
cmd = "EDITOR=%(EDITOR)s $EDITOR" % os.environ
os.system(cmd)
コードはviをEDITOR環境変数に割り当て、それをコマンドラインに渡して、コマンド(この場合はEDITOR)を実行します。