Shebangを使用してPythonのバージョンを区別する方法

Shebangを使用してPythonのバージョンを区別する方法

私たちは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/python1.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次に同じパラメータを使用して同じスクリプトで呼び出され、実行されますmodulepython

最初の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

関連情報