私たちはPythonのさまざまなバージョンを持っていますmodule load
。これは通常のPython 2または3インストールです。Python追加のライブラリが多くのバージョンです。
現在特定のPythonインストール(を使用して見つかったもの)を使用するスクリプトを作成する場合は、明示的なパスを使用する必要がありmodule load python/ana ; which python
ます。#!
例えば
#!/path/to/anaconda/1.7.0/64/bin/python
module load python/anaconda
今ロードしたPythonの現在のバージョンを指します。
しかし、このモジュールは私が管理していないので、誰かが使用するモジュールを更新してから/path/to/anaconda/1.7.1/64/bin/python
1.7.0を削除すると、私のスクリプトは機能しなくなります。
使用するインタプリタとインタプリタをロードするモジュールを指定する標準的な方法はスクリプトにありますか?それはまるで
#!/blah/module_env python/anaconda python -c
それともルートアクセスを必要としない他のオプションはありますか?当社のエンタープライズLinuxシステムはロックされているため、独自のソフトウェアをインストールしたり設定を変更したり、提供されているソフトウェア/use/bin/env
のみを使用できます。module load
答え1
私はあなたのソフトウェアに慣れていませんが、module
次のことを行うことができるようです。
#! /bin/sh -
'eval' '. "$MODULES_HOME/init/sh"; module load something || exit; exec python -- "$0" "$@"'
python script follows
最初に解釈され、sh
次に同じパラメータを使用して同じスクリプトで呼び出され、実行されますmodule
。python
最初の2行は無視されますpython
。 1つ目はコメントであるため、2つ目は2つの文字列を連結するだけです。
より一般的に:
#! /bin/sh -
'eval' 'single-line-of-shell-code-with-no-single-quote; exec python -- "$0" "$@"'
python
あらかじめ実行されているいくつかの主要なシェルコードを使用して実行可能なスクリプトを取得する一般的な方法です。複数行のシェルコードの場合は、引用python
符を使用することもできます'''...'''
。
#! /bin/sh -
':' '''python script with shell preamble'
arbitrary shell code here provided it doesn't contain
a sequence of 3 single quotes.
exec python -- "$0" "$@"
'''
print("Hello World")
だからここにあります:
#! /bin/sh -
':' '''python script with shell preamble'
"$MODULES_HOME/init/sh"
module load something || exit
exec python -- "$0" "$@"
'''
python script follows