web-dev-qa-db-ja.com

Pythonスクリプトヘッダー

典型的なヘッダーは

#!/usr/bin/env python

しかし、$python ./my_script.py

#!/usr/bin/python
#!python

これら2つのヘッダーの違いは何ですか? 2番目の問題は何でしょうか? pythonインタープリターがPATHにあるかどうかにかかわらず。ありがとう。

73
Stan

まず、次のようにインタープリターを明示的に使用してスクリプトを実行するとき

_$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3
_

_#!_行は常に無視されます。 _#!_行は、executableスクリプトのみのUnix機能であり、 manページで完全に文書化されていますexecve(2) の場合。ここで、_#!_に続くWordは有効な実行可能ファイルのパス名でなければなりません。そう

_#!/usr/bin/env python
_

ユーザー$PATH_にあるpythonが実行されます。この形式は、移動するPythonインタープリターに対して弾力性があり、移植性がいくらか向上しますが、ユーザーが標準のPythonインタープリター_$PATH_でその前に何かを置くことにより、目標に応じて、この動作はOKである場合とそうでない場合があります。

次、

_#!/usr/bin/python
_

Pythonインタープリターが_/usr/bin_にインストールされているという一般的なケースを扱います。それが他の場所にインストールされている場合、あなたは失うことになります。以下のように、「欲しい」または「何もない」(「フェイルストップ」動作)

_#!/usr/bin/python2.5
_

最後に、

_#!python
_

スクリプトの実行時に現在のディレクトリにpython実行可能ファイルがある場合にのみ機能します。推奨されません。

91
Norman Ramsey


スクリプトの冒頭で3つのことをお勧めします。

まず、既に使用環境と言われているように:

#!/usr/bin/env python

次に、エンコードを設定します。

# -*- coding: utf-8 -*-

第三に、いくつかのドキュメント文字列を設定します。

"""This is a awesome
    python script!"""

そして、確かにidentには" "(4スペース)を使用します。
最終ヘッダーは次のようになります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


最高の願いと幸せなコーディング。

23

Python実行可能ファイルは/ usr/bin以外の場所にインストールされる可能性がありますが、envはほとんど常にその場所に存在するため、/usr/bin/envはよりポータブルです。

5
Mark Byers

envのマンページから(GNU coreutils 6.10):

env - run a program in a modified environment

理論的には、envを使用して環境をリセットする(既存の環境変数の多くを削除する)か、スクリプトヘッダーに追加の環境変数を追加できます。実際には、あなたが言及した2つのバージョンは同じです。 (他の人が良い点に言及していますが、pythonからenvを指定すると、パスを知らなくてもpythonを抽象的に指定できます。)

2

はい、あります-pythonは/usr/bin、ただし/usr/local/bin(BSD)。

Virtualenvを使用する場合、~/projects/env/bin/python

1
Almad

/usr/bin/env pythonは、python virtualenvに依存するスクリプトを使用するなど、スクリプトが環境設定に依存している場合に非常に役立ちます。各virtualenvには、python binaryの独自のバージョンがあります。これは、virtualenvにインストールされているパッケージを(PYTHONPATH envに触れることなく)python.

より多くの人々がpython開発)にvirtualenvを使用し始めているので、カスタムを使用したくない場合を除き、/usr/bin/env pythonを使用することをお勧めします。 python binary。

注:また、カスタム環境でスクリプトを実行できるようにすると、潜在的なセキュリティ問題(マルチユーザー環境)があることも理解する必要があります。 here からいくつかのアイデアを得ることができます。

0
Jatin Kumar