Shebangを私のPythonスクリプトに入れるべきですか?どんな形で?
#!/usr/bin/env python
または
#!/usr/local/bin/python
これらは同じように移植可能ですか?最も使用されている形式は?
任意のスクリプトのShebang行は、端末で事前にpython
と入力しなくても(適切に設定されている場合は)ファイルマネージャでそれをダブルクリックしなくても、スタンドアロン実行可能ファイルのように実行できるスクリプトの能力を決定します。それは必要ではありませんが、一般的にそこに置くので、誰かがエディタで開かれたファイルを見るとき、彼らはすぐに彼らが見ているものを知っています。ただし、 _を使用するShebang行は_ 重要です。
正しい Python 3スクリプトの使用法は次のとおりです。
#!/usr/bin/env python3
デフォルトはバージョン3.latestです。 Python 2.7の場合は、python2
の代わりにpython3
を使用してください。
次の は使用しないでください (Python 2.xと3.xの両方と互換性のあるコードを書いているというまれなケースを除いて):
#!/usr/bin/env python
PEP 394 に記載されているこれらの推奨の理由は、python
が異なるシステム上のpython2
またはpython3
のいずれかを参照できることです。現在ほとんどのディストリビューションでpython2
を参照していますが、それはある時点で変わる可能性があります。
また、使用しないでください。
#!/usr/local/bin/python
「pythonは/ usr/bin/pythonまたは/ bin/pythonにインストールされている可能性があります。上記の#!は失敗します。」
それは本当に単なる好みの問題です。 Shebangを追加すると、必要に応じてスクリプトを直接呼び出すことができます(実行可能としてマークされていると仮定して)。これを省略すると、単にpython
を手動で呼び出す必要があります。
プログラムを実行した結果はどちらにも影響されません。それは手段の単なる選択肢です。
Shebangを私のPythonスクリプトに入れるべきですか?
次のことを示すために、ShebangをPythonスクリプトに入れます。
python
実行可能ファイルを明示的に呼び出さずに直接スクリプトを実行したい場合に必要です。これらは同じように移植可能ですか?最も使用されている形式は?
Shebang manual と書く場合は、使用しないという特別な理由がない限り、常に#!/usr/bin/env python
を使用してください。この形式はWindows(Pythonランチャー)でも理解されています。
注意: installed scriptsは特定のpython実行可能ファイル、例えば/usr/bin/python
や/home/me/.virtualenvs/project/bin/python
を使うべきです。シェルでvirtualenvを有効にした場合、いくつかのツールが壊れてもそれは悪いことです。幸いなことに、ほとんどの場合、正しいShebangはsetuptools
または配布パッケージツールによって自動的に作成されます(Windowsでは、setuptools
はラッパーの.exe
スクリプトを自動的に生成できます)。
言い換えれば、スクリプトがソースチェックアウトの場合、おそらく#!/usr/bin/env python
と表示されます。それがインストールされている場合、Shebangは#!/usr/local/bin/python
のような特定のpython実行可能ファイルへのパスです(注:後者のカテゴリからのパスを手動で書かないでください)。
Shebangでpython
、python2
、またはpython3
のどちらを使用するかを選択するには、 PEP 394 - Unix系システムでの "python"コマンド を参照してください。
...
python
は、Python 2と3の両方とソース互換性があるスクリプトにのみShebang行で使用されるべきです。デフォルトバージョンのPythonの最終的な変更に備えて、Python 2のみのスクリプトをPython 3とソース互換になるように更新するか、Shebang行で
python2
を使用するように更新する必要があります。
複数のバージョンのPythonがあり、スクリプトを特定のバージョンで実行する必要がある場合、she-bangは、スクリプトが直接実行されるときに正しいバージョンが使用されるようにします。次に例を示します。
#!/usr/bin/python2.7
スクリプトは、完全なPythonコマンドラインまたはインポートを介して実行することもできます。この場合、she-bangは無視されます。しかし、スクリプトを直接実行する場合、これがshe-bangを使用するのに適切な理由です。
#!/usr/bin/env python
は一般的により良いアプローチですが、これは特別な場合に役立ちます。
通常、Python仮想環境を確立するほうが良いでしょう。その場合、汎用的な#!/usr/bin/env python
はvirtualenvに対するPythonの正しいインスタンスを識別します。
スクリプトが実行可能であることを意図している場合は、Shebangを追加する必要があります。また、Shebangをターゲットプラットフォームで動作するように修正するインストールソフトウェアを使用してスクリプトをインストールする必要があります。この例はdistutilsとDistributeです。
Shebangの目的は、シェルからスクリプトを実行したいときに、スクリプトがインタプリタタイプを認識することです。常にではありませんが、ほとんどの場合、インタープリタを外部から提供してスクリプトを実行します。使用例:python-x.x script.py
Shebang宣言子がなくてもこれは機能します。
なぜ最初のものがより「移植性がある」のかは、/usr/bin/env
があなたのシステム実行可能ファイルが存在する全ての行き先を説明するあなたのPATH
宣言を含むからです。
注:Tornadoはshebangを厳密には使用しませんが、Djangoは厳密にはshebangを使用しません。アプリケーションの主な機能の実行方法によって異なります。
同様に:それはPythonと変わらない。
時々、答えがあまり明確でないなら(私はあなたがはいかいいえかを決めることができないことを意味します)、それはそれほど問題ではなく、答え が clearになるまで問題を無視できます。
#!
のみの目的はスクリプトを起動することです。 Djangoは独自にソースをロードしてそれらを使用します。どのインタプリタを使うべきかを決める必要は決してありません。このように、#!
は実際には意味がありません。
一般に、それがモジュールでスクリプトとして使用できない場合は、#!
を使用する必要はありません。一方、モジュールのソースには、少なくとも機能の簡単なテストを伴うif __== '__main__': ...
が含まれていることがよくあります。それから#!
は再び意味を成します。
#!
を使用する1つの良い理由は、Python 2とPython 3の両方のスクリプトを使用する場合です。それらは異なるバージョンのPythonで解釈される必要があります。この方法では、スクリプトを手動で起動するときにpython
を使用する必要があることを覚えておく必要があります(内部の#!
は不要です)。このようなスクリプトが混在する場合は、内部で#!
を使用し、それらを実行可能にし、それらを実行可能ファイル(chmod ...)として起動することをお勧めします。
MS-Windowsを使うとき、#!
は意味がありません - 最近まで。 Python 3.3では、#!
行を読み取り、インストールされているバージョンのPythonを検出し、正しいバージョンまたは明示的に必要なバージョンのPythonを使用するWindows Python Launcher(py.exeおよびpyw.exe)が導入されました。拡張子はプログラムに関連付けることができるので、Windowsでは、Unixベースのシステムのexecuteフラグと同じように動作します。
私が最近Windows 7にPython 3.6.1をインストールしたとき、それはWindows用のPythonランチャーもインストールしました。しかし、私は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 Shebangのライン処理は上記のように動作しました。
使用する適切なShebang文字列を確認することから始めます。
which python
そこから出力を取り、最初の行に(Shebang#を付けて)追加します。
私のシステムでは、次のように応答します。
$which python
/usr/bin/python
だからあなたのShebangはこんな感じになるだろう:
#!/usr/bin/python
保存しても、pythonはその最初の行をコメントとして認識するので、以前と同じように実行されます。
python filename.py
それをコマンドにするには、それをコピーして.py拡張子をドロップします。
cp filename.py filename
ファイルシステムに、これが実行可能になるように伝えます。
chmod +x filename
それをテストするには、次のようにします。
./filename
ベストプラクティスは、$ PATHのどこかに移動することです。入力する必要があるのはファイル名だけです。
Sudo cp filename /usr/sbin
そのようにそれはどこでも(ファイル名の前に./なしで)動作するでしょう。