Pythonスクリプトのシバンはどのように見えるべきですか?
#!/usr/bin/env pythonPythonインタープリターをインテリジェントに見つけることができるため、サポートする人もいます。#!/usr/bin/python現在ほとんどのGNU/Linuxディストリビューションpythonではデフォルトのプログラムであるため、他の人はをサポートしています。
2つのバリアントの利点は何ですか?
DebianPythonポリシーは次のように述べています。
Pythonインタープリターの推奨仕様はまたは
/usr/bin/pythonです/usr/bin/pythonX.Y。これにより、PythonのDebianインストールが使用され、追加のpythonモジュールへのすべての依存関係が満たされます。
/usr/bin/env pythonメンテナは、またはを使用してDebianPythonインタプリタをオーバーライドしないでください/usr/bin/env pythonX.Y。これは、Debianの依存関係チェックをバイパスし、パッケージをPythonの不完全なローカルインストールに対して脆弱にするため、お勧めできません。
Debian / Ubuntuは、代替システムを使用して、/usr/bin/python実際にどのバージョンを指しているかを管理していることに注意してください。これは、少なくとも私にとっては多くのpythonバージョンで非常にうまく機能しており(現在は2.3から2.7までpythonを使用しています)、更新間で優れた移行が行われます。
を使用したことがないことにpip注意してください。自動セキュリティアップグレードが必要なので、Pythonの必要なものをすべて。を介してインストールしますaptitude。公式のDebian/Ubuntuパッケージを使用すると、Pythonのインストールを自分でいじるよりもはるかにクリーンなシステムになります。
一つ強調しておきます。上記の推奨事項は、Pythonアプリケーションのシステムインストールに関するものです。これらにシステム管理バージョンのPythonを使用させることは完全に理にかなっています。オペレーティングシステムによって管理されていない独自のカスタマイズされたPythonのインストールを実際に試している場合は、システムをハードコーディングするのではなく、envバリアントを使用することが「ユーザーが好むPythonを使用する」という正しい言い方です。 Pythonのインストール(これは/usr/bin/python)または任意のユーザーカスタムパス。
env pythonすると、たとえばpython virtualenvからプログラムを呼び出すと、プログラムの動作が異なります。これは望ましい場合があります(たとえば、virtualenvでのみ機能するスクリプトを作成している場合)。また、問題が発生する可能性があります(ツールを作成し、virtualenv内でも同じように機能することを期待します。パッケージが欠落しているため、突然失敗する可能性があります)。
私の謙虚な意見は、env-variantを使用する必要があるということです。これは、ほとんどすべてのシステムに見られるPOSIXコンポーネントですが/usr/bin/python、多くの場合、つまりvirtualenvセットアップでブレークを直接指定します。
#!/usr/bin/env pythonOS-Xのデフォルトのインストール場所はNOTです /usr/bin。これは、環境をカスタマイズしたいユーザーにも当てはまります。これ/usr/local/binは、Pythonディストリビューションを見つける可能性のあるもう1つの一般的な場所です。
そうは言っても、それはそれほど重要ではありません。スクリプトは、必要なPythonバージョンでいつでもテストできます /usr/bin/strange/path/python myscript.py。また、setuptoolsを介してスクリプトをインストールすると、shebangはそのスクリプトをインストールしたものに置き換えられるようですsys.executable-私にはわかりませんがpip、同じように動作すると思います。
お気づきのように、どちらもLinuxで動作する可能性があります。ただし、誰かが自分で使用するために新しいバージョンのpythonをインストールした場合、または何らかの要件によって特定のバージョンを/ usr / binに保持する必要がある場合、envを使用すると、呼び出し元は別のバージョンが呼び出されるように環境を設定できます。環境
Python3がスクリプトで動作するかどうかを確認しようとしている人を想像してみてください。パスの最初にpython3インタープリターを追加しますが、2.xで実行されているシステムではデフォルトのままにしておきます。不可能なハードコードされたパスを使用します。