特定のPythonインストールで実行する必要があるPythonスクリプトがあります。 shebangで実行する方法はありますか$FOO/bar/MyCustomPython
?
答え1
Shebangラインは非常に限られています。多くのUNIXバリアント(Linuxを含む)では、コマンドと引数という2つの単語しかありません。通常、長さ制限もあります。
一般的な解決策は、小さなシェルラッパーを書くことです。 Pythonスクリプトに名前を付けて、foo.py
その横にシェルスクリプトを置いてfoo.py
呼び出しますfoo
。この方法では、Pythonスクリプトに特定のヘッダーは必要ありません。
#!/bin/sh
exec "$FOO/bar/MyCustomPython" "$0.py" "$@"
もう一つの魅力的なアプローチは、上記のようなラッパースクリプトを作成して、#!/path/to/wrapper/script
Pythonスクリプトの上にshebang行に配置することです。ただし、ほとんどの unices は shebang スクリプト接続をサポートしていないため、機能しません。
MyCustomPython
にいる場合は、以下を使用して見つけることができ$PATH
ますenv
。
#!/usr/bin/env MyCustomPython
import …
もう1つのアプローチは、スクリプトを有効なシェルスクリプト(自動的に正しいPythonインタプリタをロードする)とターゲット言語(ここではPython)の有効なスクリプトにソートすることです。これを行うには、ターゲット言語用のバイリンガルスクリプトを作成する方法を見つける必要があります。 Perlではこれをこう呼んでいます。if $running_under_some_shell
。
#!/bin/sh
eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}'
if $running_under_some_shell;
use …
Pythonで同じ効果を得る1つの方法は次のとおりです。シェルは、その引数(2つの単一文字文字列の合計)を無視して真の値を返すユーティリティ"true"
です。 Pythonでは、ブール値として解釈されたときに真の文字列なので、常に真で文字列リテラルを実行するコマンドです。true
:
'
"true"
if
#!/bin/sh
if "true" : '''\'
then
exec "$FOO/bar/MyCustomPython" "$0" "$@"
exit 127
fi
'''
import …
答え2
$FOO/MyCustomPython
Shebang行は変数拡張を行わず、Dollar-FOO-....という実行ファイルを検索するため使用できません。
別のアプローチは、シェバンがシェルスクリプトをインタプリタとして指すようにすることです。これにより、シェルスクリプトは環境変数を使用して正しいスクリプトを見つけて実行できます。
mypython.sh
例:次の内容を使用して(またはユーザーの他のディレクトリ)にスクリプトを作成します。/usr/local/bin
$PATH
#! /bin/sh
PYTHON="$FOO/bar/MyCustomPython"
exec "$PYTHON" "$@"
MyCustomPython
その後、このShebang行を使用して次のようにPythonスクリプトを実行できますmypython.sh
。
#!/usr/bin/env mypython.sh
答え3
カスタムPythonインストールの絶対パスを使用するか、それをユーザーパスに配置して$PATH
使用できます#!/usr/bin/env [command]
。それ以外の場合は、ラッパーを作成し、それを使用してexec
プロセスイメージを置き換えます。例:
#!/bin/bash
exec "$ENV/python" "$@"
答え4
$FOO
inを特定のパスオプションに置き換えることができる場合は、$FOO/bar/MyCustomPython
そのパスに直接env
カスタムラインを設定して、カスタムPythonバージョンを見つける場所をshebangに通知できます。PATH
#!/usr/bin/env PATH="/path1/to/MyCustomPython:/path2/to/MyCustomPython" python
編集する:PATH値の割り当てに引用符がない場合にのみ機能するようです。
#!/usr/bin/env PATH=/path1/to/MyCustomPython:/path2/to/MyCustomPython python