1066

Python スクリプトにシバンを入れる必要がありますか? どんな形で?

#!/usr/bin/env python 

また

#!/usr/local/bin/python

これらは同じように移植可能ですか? 最も使用されているフォームはどれですか?

注: tornadoプロジェクトはシバンを使用します。一方、 Djangoプロジェクトはそうではありません。

4

14 に答える 14

1442

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を参照するpython2python3、異なるシステムを参照できるためです。

また、使用しないでください:

#!/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"

于 2013-10-10T19:58:55.773 に答える
82

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

プログラムを実行した結果は、どちらの方法でも影響を受けません。それは手段の単なるオプションです。

于 2011-08-02T06:39:30.047 に答える
40

Python スクリプトにシバンを入れる必要がありますか?

シバンを Python スクリプトに挿入して、次のことを示します。

  • このモジュールはスクリプトとして実行できます
  • python2、python3 でのみ実行できるか、または Python 2/3 と互換性があるか
  • pythonPOSIX では、実行可能ファイルを明示的に呼び出さずにスクリプトを直接実行する場合に必要です。

これらは同じように移植可能ですか? どのフォームが最も使用されていますか?

シバンを手動で#!/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 です(注:後者のカテゴリからのパスを手動で記述しないでください)。

シバンでpythonpython2、またはを使用するかどうかを選択するには、 PEP 394 - Unix-Like Systems での "python" コマンド を参照してください。python3

  • ... pythonPython 2 と 3 の両方とソース互換性のあるスクリプトに対してのみ、シバン行で使用する必要があります。

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

于 2015-08-12T01:58:47.827 に答える
13

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

于 2011-08-02T07:42:26.557 に答える
13

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

これは、シバン宣言子がなくても機能します。

最初のものがより「ポータブル」である理由は、システムの実行可能ファイルが存在するすべての宛先を説明する宣言が/usr/bin/env含まれているためです。PATH

注: Tornado はシバンを厳密には使用しませんが、Django は厳密には使用しません。アプリケーションのメイン関数をどのように実行しているかによって異なります。

ALSO: Python でも変わりません。

于 2011-08-02T06:45:12.290 に答える
9

最近、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 シバン行の処理は上記のように機能しました。

于 2017-06-02T01:40:09.273 に答える
2

これは、移植性に関して、Python インタープリターへのパスを絶対パスにするか論理パスにするか( ) に関する問題です。/usr/bin/env

動作を徹底的にテストした後の私の見解は、she-bang の論理パスが 2 つのオプションのうち優れているということです。

Linux エンジニアとしての私の目標は常に、開発者のクライアントに最適で最適化されたホストを提供することです。そのため、Python 環境の問題は、私が本当に確実な答えを必要としているものです。この問題について証明をサポートせずに一般的な方法で話している他のスタック オーバーフロー サイトで他の回答に遭遇したので、 Unix.SE でこの質問に対して非常に詳細なテストと分析を行いました。

于 2020-04-11T09:29:23.520 に答える
1

pyenv のような仮想環境を使用する場合は、次のように記述することを#!/usr/bin/env python お勧めします。 pyenv 設定は、どのバージョンの Python と、どのファイルの場所からスクリプトを実行するかを制御します。

コードがバージョン固有であることがわかっている場合、シバンで予想されるバージョンを指定すると、スクリプトが環境で動作しない理由を他の人が見つけるのに役立ちます。

于 2021-03-30T20:04:39.083 に答える