Python スクリプトにシバンを入れる必要がありますか? どんな形で?
#!/usr/bin/env python
また
#!/usr/local/bin/python
これらは同じように移植可能ですか? 最も使用されているフォームはどれですか?
python
スクリプトのシバン行は、ターミナルで事前に入力したり、ファイルマネージャーでダブルクリックしたりせずに(適切に構成されている場合)、スタンドアロンの実行可能ファイルのようにスクリプトを実行できるかどうかを決定します。必須ではありませんが、一般的にはそこに置かれているため、誰かがエディターでファイルを開いたときに、何を見ているのかがすぐにわかります。ただし、どのシバン ラインを使用するかは重要です。
(デフォルトはバージョン 3.latest) Python 3スクリプトの正しい使用法は次のとおりです。
#!/usr/bin/env python3
Python 2スクリプト(デフォルトはバージョン 2.latest) の正しい使用法は次のとおりです。
#!/usr/bin/env python2
以下は使用しないでください(Python 2.x と 3.x の両方と互換性のあるコードを書いているというまれなケースを除きます):
#!/usr/bin/env python
PEP 394に記載されているこれらの推奨事項の理由は、異なるシステムpython
を参照するpython2
かpython3
、異なるシステムを参照できるためです。
また、使用しないでください:
#!/usr/local/bin/python
「そのような場合、python は /usr/bin/python または /bin/python にインストールされる可能性があり、上記の #! は失敗します。」
―<a href="https://mail.python.org/pipermail/tutor/2007-June/054816.html" rel="noreferrer">"#!/usr/bin/env python" vs "#!/ usr/local/bin/python"
それは本当に好みの問題です。シバンを追加すると、必要に応じてスクリプトを直接呼び出すことができます(実行可能としてマークされていると仮定)。省略するとpython
、手動で呼び出す必要があります。
プログラムを実行した結果は、どちらの方法でも影響を受けません。それは手段の単なるオプションです。
Python スクリプトにシバンを入れる必要がありますか?
シバンを Python スクリプトに挿入して、次のことを示します。
python
POSIX では、実行可能ファイルを明示的に呼び出さずにスクリプトを直接実行する場合に必要です。これらは同じように移植可能ですか? どのフォームが最も使用されていますか?
シバンを手動で#!/usr/bin/env python
作成する場合は、使用しない特別な理由がない限り、常に使用してください。このフォームは、Windows (Python ランチャー) でも理解されます。
注:インストールされたスクリプトは、特定の python 実行可能ファイルを使用する必要があり/usr/bin/python
ます/home/me/.virtualenvs/project/bin/python
。シェルで virtualenv を有効にすると、一部のツールが壊れてしまうのは良くありません。setuptools
幸いなことに、ほとんどの場合、ディストリビューション パッケージ ツールによって正しいシバンが自動的に作成されます (Windows では、setuptools
ラッパー.exe
スクリプトを自動的に生成できます)。
つまり、スクリプトがソース チェックアウトにある場合は、おそらく#!/usr/bin/env python
. インストールされている場合、シバンは次のような特定のpython実行可能ファイルへのパス#!/usr/local/bin/python
です(注:後者のカテゴリからのパスを手動で記述しないでください)。
シバンでpython
、python2
、またはを使用するかどうかを選択するには、 PEP 394 - Unix-Like Systems での "python" コマンド を参照してください。python3
...
python
Python 2 と 3 の両方とソース互換性のあるスクリプトに対してのみ、シバン行で使用する必要があります。Python のデフォルト バージョンの最終的な変更に備えて、Python 2 のみのスクリプトは、Python 3 とソース互換性があるように更新するか
python2
、シェバン行で使用する必要があります。
スクリプトを実行可能にする場合は、シバンを追加する必要があります。また、ターゲット プラットフォームで動作するように、シバンを正しいものに変更するインストール ソフトウェアを使用してスクリプトをインストールする必要があります。この例は、distutils と Distribute です。
シバンの目的は、シェルからスクリプトを実行するときに、スクリプトがインタープリターのタイプを認識できるようにすることです。常にではありませんが、ほとんどの場合、インタープリターを外部から提供してスクリプトを実行します。使用例:python-x.x script.py
これは、シバン宣言子がなくても機能します。
最初のものがより「ポータブル」である理由は、システムの実行可能ファイルが存在するすべての宛先を説明する宣言が/usr/bin/env
含まれているためです。PATH
注: Tornado はシバンを厳密には使用しませんが、Django は厳密には使用しません。アプリケーションのメイン関数をどのように実行しているかによって異なります。
ALSO: Python でも変わりません。
最近、Windows 7 に Python 3.6.1 をインストールしたときに、シバン行を処理することになっている Windows 用の Python Launcher もインストールされました。しかし、Python Launcher ではこれが行われないことがわかりました。shebang 行は無視され、Python 2.7.13 が常に使用されていました (py -3 を使用してスクリプトを実行しない限り)。
これを修正するには、Windows レジストリ キーを編集する必要がありましたHKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
。これはまだ価値がありました
"C:\Python27\python.exe" "%1" %*
以前の Python 2.7 インストールから。このレジストリ キーの値を次のように変更しました。
"C:\Windows\py.exe" "%1" %*
そして、Python Launcher シバン行の処理は上記のように機能しました。
これは、移植性に関して、Python インタープリターへのパスを絶対パスにするか論理パスにするか( ) に関する問題です。/usr/bin/env
動作を徹底的にテストした後の私の見解は、she-bang の論理パスが 2 つのオプションのうち優れているということです。
Linux エンジニアとしての私の目標は常に、開発者のクライアントに最適で最適化されたホストを提供することです。そのため、Python 環境の問題は、私が本当に確実な答えを必要としているものです。この問題について証明をサポートせずに一般的な方法で話している他のスタック オーバーフロー サイトで他の回答に遭遇したので、 Unix.SE でこの質問に対して非常に詳細なテストと分析を行いました。
pyenv のような仮想環境を使用する場合は、次のように記述することを#!/usr/bin/env python
お勧めします。 pyenv 設定は、どのバージョンの Python と、どのファイルの場所からスクリプトを実行するかを制御します。
コードがバージョン固有であることがわかっている場合、シバンで予想されるバージョンを指定すると、スクリプトが環境で動作しない理由を他の人が見つけるのに役立ちます。