webdevqa.jp.net

私は#を置く必要があります! Pythonスクリプトで(Shebang)、どのような形式をとるべきですか?

Shebangを私のPythonスクリプトに入れるべきですか?どんな形で?

#!/usr/bin/env python 

または

#!/usr/local/bin/python

これらは同じように移植可能ですか?最も使用されている形式は?

注:トルネード プロジェクトはShebangを使用します。一方、 Django プロジェクトはそうではありません。

638
treecoder

任意のスクリプトの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にインストールされている可能性があります。上記の#!は失敗します。」

- "#!/ usr/bin/env python"と "#!/ usr/local/bin/python" /

875
GlassGhost

それは本当に単なる好みの問題です。 Shebangを追加すると、必要に応じてスクリプトを直接呼び出すことができます(実行可能としてマークされていると仮定して)。これを省略すると、単にpythonを手動で呼び出す必要があります。

プログラムを実行した結果はどちらにも影響されません。それは手段の単なる選択肢です。

67
Amber

Shebangを私のPythonスクリプトに入れるべきですか?

次のことを示すために、ShebangをPythonスクリプトに入れます。

  • このモジュールはスクリプトとして実行できます
  • python2、python3でしか実行できないのか、それともPython 2/3互換なのか
  • pOSIXでは、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でpythonpython2、またはpython3のどちらを使用するかを選択するには、 PEP 394 - Unix系システムでの "python"コマンド を参照してください。

  • ... pythonは、Python 2と3の両方とソース互換性があるスクリプトにのみShebang行で使用されるべきです。

  • デフォルトバージョンのPythonの最終的な変更に備えて、Python 2のみのスクリプトをPython 3とソース互換になるように更新するか、Shebang行でpython2を使用するように更新する必要があります。

25
jfs

複数のバージョンのPythonがあり、スクリプトを特定のバージョンで実行する必要がある場合、she-bangは、スクリプトが直接実行されるときに正しいバージョンが使用されるようにします。次に例を示します。

#!/usr/bin/python2.7

スクリプトは、完全なPythonコマンドラインまたはインポートを介して実行することもできます。この場合、she-bangは無視されます。しかし、スクリプトを直接実行する場合、これがshe-bangを使用するのに適切な理由です。

#!/usr/bin/env pythonは一般的により良いアプローチですが、これは特別な場合に役立ちます。

通常、Python仮想環境を確立するほうが良いでしょう。その場合、汎用的な#!/usr/bin/env pythonはvirtualenvに対するPythonの正しいインスタンスを識別します。

15
Chris Johnson

スクリプトが実行可能であることを意図している場合は、Shebangを追加する必要があります。また、Shebangをターゲットプラットフォームで動作するように修正するインストールソフトウェアを使用してスクリプトをインストールする必要があります。この例はdistutilsとDistributeです。

10
Lennart Regebro

Shebangの目的は、シェルからスクリプトを実行したいときに、スクリプトがインタプリタタイプを認識することです。常にではありませんが、ほとんどの場合、インタープリタを外部から提供してスクリプトを実行します。使用例:python-x.x script.py

Shebang宣言子がなくてもこれは機能します。

なぜ最初のものがより「移植性がある」のかは、/usr/bin/envがあなたのシステム実行可能ファイルが存在する全ての行き先を説明するあなたのPATH宣言を含むからです。

注:Tornadoはshebangを厳密には使用しませんが、Djangoは厳密にはshebangを使用しません。アプリケーションの主な機能の実行方法によって異なります。

同様に:それはPythonと変わらない。

9
meson10

時々、答えがあまり明確でないなら(私はあなたがはいかいいえかを決めることができないことを意味します)、それはそれほど問題ではなく、答え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フラグと同じように動作します。

7
pepr

私が最近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のライン処理は上記のように動作しました。

2
ETalbot

回答:コマンドライン実行可能スクリプトにする予定がある場合のみ。

手順は次のとおりです。

使用する適切な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

そのようにそれはどこでも(ファイル名の前に./なしで)動作するでしょう。

1
SDsolar