LinuxのPythonに#!/ usr / bin / pythonの行が必要なのはなぜですか?


50

非常に簡単な質問:Linuxでは、なぜPythonに次の行が必要なのですか?

#!/usr/bin/python

Windowsはそうではないので、Pythonファイルの開始時に?

それは何をするためのものか?「「Pythonへのリンク」という説明は少しあいまいなので...


28
以下の回答はすべて正しいものであり、Windowsがこの行を必要としない理由に対処するものはありません。Windowsは、ファイルの拡張子(の後の部分.)に依存して、どのような種類のファイルかを判断します。Windowsでさえ、これから遠ざかりつつあります。MicrosoftWordファイルの最初の数行を調べると、実際にはMicrosoft Wordファイルであると表示されます。
チャールズグリーン

9
部屋の象は、Python 2および3と互換性がない限り、決して/ usr / bin / pythonを使用してはいけないということです。理由:archはそれをpython3にシンボリックリンクします。
さらに別のユーザー

5
それは暗示されていますが、以下の回答では必要ではないことを明示的に述べていません。ts自身の名前からのみスクリプトを実行する場合に必要です。python myscript.py代わりにいつでも実行できます。
クリスH

3
@CharlesGreen私たちは、なぜウィンドウがそうでないのかを知るつもりはありません;-)それはSO次第です。
リンツウィンド

2
@YetAnotherUser Python 3がリリースされてから6年11ヶ月が経ちましたが、この時点で、デフォルトで3に設定し、必要に応じて2の使用を明示的に指定した方が良いと思います。
JAB

回答:


58

Pythonには、Linuxではそのような特別な要件はありません。呼ばれているように、「shebang」行を使用するのは、Unix / Linux上のプログラムローダーです。これは実際には制限ではなく機能ですが、すぐにそれを説明します。「shebang」のWikiページには詳細がありますが、ここでは概要とWindowsとの比較について説明します。

まず、Windowsの状況を見てみましょう。

  • ファイルを開くか実行しようとすると、Windowsは最初にそのファイルの拡張子を調べます。これは、で始まるファイル名の最後の部分.ですPythonファイルの場合、これは通常.pyです。
  • Windowsは、ファイル拡張子に基づいて実行するアクションを検索します。
    • この情報はWindowsレジストリに記録されます。Pythonがインストールされると、通常は.py、新しくインストールされたアプリケーション Python(Pythonインタープリター)を使用してファイルを開く必要があることをWindowsに通知します。
    • いくつかのファイルタイプには組み込みの動作があります。たとえば、実行可能ファイル(Pythonインタープリター自体など)はで終わる必要があり.exe.batファイルはWindowsバッチスクリプトとして実行されます。
    • 特定のファイルタイプに対して実行されるアクションはカスタマイズ可能です。たとえば、Windowsにを使用して.pyファイルを実行する代わりにpython.exe、テキストエディターなどの他のプログラムでファイルを開くように指示できますnotepad.exe
      • この場合、Pythonスクリプトを実行するに手動で呼び出すpython <scriptname>.py(または.batこれを行うファイルを作成する)必要があります。

さて、Pythonスクリプトの先頭にシェバン行(#!/usr/bin/pythonまたは#!/usr/bin/env python)があるとどうなりますか?以来、まあ、#Pythonでコメント行で、Pythonインタプリタはそれを無視します。これが、Unix / Linuxの世界で使用されるほとんどのスクリプト言語が#コメント行の開始に使用する理由の1つです。

そのため、Windowsがその#!行を「必要としない」と言うのは少し誤解を招きます。Windowsはしない参照#!ラインを、実際に何をすべきか、それを伝えるために、ファイルの拡張子に依存しています。これにはいくつかの欠点があります。

  • 自動的に認識されるようにするには、最後にPythonスクリプトに名前を付ける必要あり.pyます。
  • Python2スクリプトとPython3スクリプトを区別する簡単な方法はありません。
  • 前述のように、.pyファイルタイプのデフォルトの起動動作を変更すると、WindowsはPythonでこれらのスクリプトを自動的に実行しなくなります。これは意図せずに行われる可能性があることに注意してください。

次に、Unix / Linuxがスクリプトを起動する方法を見てみましょう。

最初に注意することは、Unix / Linuxは、Windowsとは異なり、少なくとも概念的には特定のプログラムを使用してPythonスクリプトを「オープン」しようとしないことです。OS は、スクリプトが「実行ビット」と呼ばれるもの(この回答の範囲外)によって実行できるものであることを知っています。したがって、誤っての#!/usr/bin/pthon代わりに入力すると#!/usr/bin/python、次のテキストを含むエラーメッセージが表示されます。

/usr/bin/pthon: bad interpreter: No such file or directory.

「インタープリター」という言葉は、シバン行の役割についての手がかりを与えてくれます(技術的には、指定されたプログラムはcat、テキストエディターなどのインタープリター以外のものでもかまいません)。ファイルを実行しようとすると、次のようになります。

  • Unix / Linuxプログラムローダーは、そのファイルの最初の2バイトを調べます。これらの2バイトがの#!場合、ローダーは、シバン行の残りの部分(シバン自体を除く)を、ファイルの内容をスクリプトとして実行するインタープリターを起動するコマンドとして解釈します。
  • プログラムローダーは、指定されたインタープリターを起動し、元のファイルのパスを引数として渡します。

これにはいくつかの利点があります。

  • スクリプト作成者は、どのインタープリターを使用するか(Python2 / Python3の問題を解決する)をより細かく制御でき、時にはインタープリターに追加の引数を渡すことができます(詳細については、Wikiページを参照してください)。
  • スクリプトのファイル名は無視されるため、Pythonスクリプトに任意の名前を付けることができます。

最後に、Unix / LinuxはPythonスクリプトを実行するためにshebang行を必要とない ことに注意してください。実際に実行されるのは、プログラムローダーがインタープリターを選択できるようにすることだけです。ただし、Windowsと同様に、これは手動で行うことができます。

python <myscript>

1
Windowsでは、あなたは簡単かもしれない.py2.py33つのスクリプトをPythonの2 / Python用の拡張機能。そのため、Linux(+ xビット)とWindows(ファイル拡張子)の両方にファイルシステムのメタデータが必要です。主な違いは、+ xビットが転送中により簡単に失われることです。これは必ずしも欠点ではありません。
–MSalters

1
@MSalters実行ビットには、エンコードされる情報がはるかに少なくなります。また、特定のシステム上に複数のPython2インタープリターが存在する可能性があることに注意してください(以前の私の仕事ではRubyや他の言語でも同様の状況がありました)。シェバンラインを介してこれを処理することはほとんど簡単ですが、Windowsの状況は、複数の類似のファイルタイプを管理しようとするほど、扱いにくくなります。
カイルストランド

また、拡張機能は本当に「メタデータ」としてカウントされますか?これはファイル名の一部です。
カイルストランド

1
ファイルのメタデータには、ファイル名全体、作成時間、アクセスビットなどが含まれます。メタデータではなくコンテンツ自体のみがデータです。「複数のインタプリタ」に関しては、それは確かに本当の問題であり、まさにそれシバンの行にあるべきはない理由です。あなたは何をしている場合/usr/bin/i686/python/usr/bin/amd64/python?完全に合理的ですが、でハードコードされた仮定を持つpythonスクリプトを壊し/usr/bin/pythonます。インタプリタの選択は、スクリプト作成者の選択ではなく、スクリプトユーザーの選択です。スクリプト作成者は言語(方言)を選択するだけです。
–MSalters

1
@MSaltersまあ、それ/usr/bin/envはenv-setupスクリプトと一緒に使用するものです。これのWindowsバージョンは何ですか?ファイルをregedit起動する直前にスクリプトを実行して、.py必要なインタープリターを確実に取得しますか?
カイルストランド

41

指定した行は、ファイル/スクリプトを直接実行するときに使用するプログラム/インタープリター、およびスクリプトの実行時にそのプログラムに渡す必要のある引数をコンピューターに伝えるために使用されます。ただし、これはPythonの要件ではなく、スクリプトを直接実行する場合のLinuxカーネル/システムの要件です(以下の構文ではPythonに渡しません)。

実行する場合などは必要ありませんpython script.py。使用するインタープリター(などpython)を提供せずに、スクリプト/ファイルを直接実行する場合にのみ必要です。


Bashスクリプトの場合、次のようなものになります。

#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;

これは、これが実行されるとき、システム上/bin/bashのシェル/シェルスクリプト言語の1つであるそれを介して実行されるべきであることをシステムに示します。


ただし、Pythonコードの場合、ここでは、Pythonを介して実行可能ファイルを実行したいので、実行するインタープリターを指定します。

#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()

これは、Bashの場合と同様に、/usr/bin/python使用する必要があることを示します(これは、個々のシステム構成に応じて、おそらくPython 2またはPython 3です)。


このようにして、実行することができます./filename.py./executableまたは./scripttorun直接。

冒頭にその行がなく、ファイル/スクリプトを実行可能に設定したと仮定し、Pythonスクリプトで作業していると仮定すると、python filename.pyその#!/usr/bin/python行がない場合は実行するか、または同様にする必要があります。(Bashスクリプトの場合bash script.sh、Perl、Rubyなどの他のスクリプト/言語の場合、または同様の操作を行う必要があります。)

上記の構文の強調表示は、各セクションで言語固有ですが、実際には重要ではありません。


1
追加する興味深いのは、インタプリタが(直接呼ばれていたかのように同じ方法で、ほとんどの場合、シェバング自体の後に追加のパラメータを指定することは可能だということだろう#!/bin/bash -x#!/usr/bin/perl -lanなど)。
コス

7
@kos:追加の引数を1つだけ指定できると思います。これは/usr/bin/env python、正しいPythonを取得する(使用する)ときにPITAでした。
unperson325680

@progoの問題は不明envですが、問題は引数の数ではないようです#!/usr/bin/perl -l -a -n。3つの引数がありますが、動作します。繰り返しますが、私は正確な問題を理解することはできません。
コス

スクリプトを引数としてインタープリターを明示的に呼び出す場合、後者をで開始する理由はありません./。言い換えれば、ちょうどpython filename.pyまたbash script.shはうまく動作します。含める唯一の理由./は、コマンド名にあります。シェルに検索しないように$PATH(おそらく現在のディレクトリでファイルを見つけられないように)シェルに伝えたいが、指定したパスをそのまま使用する場合です。しかし、それはコマンド引数には適用されません。
マークヴァンレーベン

@kos:問題はenv、カーネルから残りの引数をどのように受け取るかにあります。それらはすべて、スペースによる分割が実行されていない1つの大きな引数であると推定できます。はっきり言って申し訳ありませんが、これの詳細はもうよく覚えていません
-unperson325680

16

この線:

#!/usr/bin/python

「シェバン」と呼ばれ、ファイル内の残りのコマンドを解釈するために使用されるインタープリターバイナリへのパスを示します。通常、スクリプトの最初の行です。

そのため、この行#!/usr/bin/pythonは、ファイルの内容がにあるpythonバイナリによって解釈されることを示しています/usr/bin/python

シェバン行はカーネルによって解析され、その後スクリプトは最終的に引数として呼び出されることに注意してください。

python script_name

同様の場合#!/bin/bash

bash script_name

2
私は今までハイフンを見たことがないと思いますshebang。単語は「ハッシュ」と「バング」から形成されるため、スペルは「she」と「bang」の組み合わせのように見えるため、あまり明確ではありません。
カイルストランド

キャラクターの名前の付け方に応じて、それをhashbang#= "hash")またはshebang#= "sharp")と呼ぶことができます#。しかし、shebang実際にはより一般的です。@KyleStrand
バイトコマンダー

7

技術的には、それは必要ありません。スクリプトを実行する環境へのパスが必要です。今後のスクリプトでは、/ usr / bin / envを含めてからpythonを指定する方が良いでしょう。これにより、Pythonがインストールされている場所に関係なく、スクリプトがPython環境で実行されることが付与されます。互換性の理由でこれを行いたい場合、コードを共有する次の人がpythonをusr / bin / pythonにインストールするか、それらのシステムファイルへのアクセス許可を持つかを確認することはできません。

スタックオーバーフローの同様のQ&Aを次に示します

スクリプトでは次のようになります。

#!/usr/bin/env python

python3を指定する方法についても懸念があります。方法は次のとおりです。

#!/usr/bin/env python3

5

Linuxでは、Pythonは#!(shebang)行を必要とする場合と必要としない場合があります。これは、Python対話モードまたはPythonスクリプトでコードを実行するPythonコードの処理方法に依存します。

Pythonインタラクティブモードを使用すると、ユーザーはPythonコードを直接入力して実行できます。これには、shebang行は必要ありません。対話モードを実行するには、ターミナルを開き、pythonPython 2.Xまたはpython3Python 3.Xを入力します。

$  python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$  python3
Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Pythonスクリプトを使用すると、ユーザーはPythonコードを記述してプレーンテキストファイルに保存し、後でコードを実行できます。これには、シバンラインが必要な場合と必要でない場合があります。ただし、LinuxでPythonスクリプトを使用するためにshebang行が必要な場合、2つの既知の理由があります。

  1. 実行可能スクリプトでPythonコードを実行するには、つまり、コードの実行方法と、どのインタープリターを使用するかを定義します。

  2. 特定のバージョンのPythonに関してPythonコードを実行します。つまり、Python 2.XまたはPython 3.Xのみと互換性のあるコードを実行します。

Pythonスクリプトで練習する

以下にファイルのリストと内容を示します。これは、#!(シバン)行が必要かどうかを示すために使用しました。

$  ls -ln *.py
-rw-rw-r-- 1 1000 1000  94 Dec 14 18:37 hello1.py
-rwxrwxr-x 1 1000 1000 116 Dec 14 18:37 hello2e.py
-rw-rw-r-- 1 1000 1000 116 Dec 14 18:37 hello2.py
-rwxrwxr-x 1 1000 1000 117 Dec 14 18:37 hello3e.py
-rwxrwxr-x 1 1000 1000 120 Dec 14 18:37 hello3m.py
-rw-rw-r-- 1 1000 1000 117 Dec 14 18:37 hello3.py

$  file *.py
hello1.py:  ASCII text
hello2e.py: Python script, ASCII text executable
hello2.py:  Python script, ASCII text executable
hello3e.py: Python script, ASCII text executable
hello3m.py: Python script, UTF-8 Unicode (with BOM) text executable
hello3.py:  Python script, ASCII text executable
  • hello1.py ソースコードのみが含まれます。

    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
    
  • hello2.py ソースコードとシバン行が含まれています。

    #!/usr/bin/env python
    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
    
  • hello2e.pyと同じhello2.pyで実行可能になっています。

  • hello3.pyと同じhello2.pyですが、最初の行の名前を#!/usr/bin/env python3

  • hello3e.pyと同じhello3.pyで実行可能になっています。

  • hello3m.pyテキストエディタのオプション(マウスパッドなど)でhello3.py保存されているWrite Unicode BOMことを除き、と同じで実行可能になっています。

この点を超えて、ユーザーにはPythonスクリプトを実行する2つの方法が提示されます。両方の方法が以下のように示されています。

方法1:Pythonプログラムで実行する

以下は、Python 2およびPython 3でソースコードを実行するときのコマンドと出力です。

$  python hello1.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  python3 hello1.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

Pythonの両方のバージョンは、スクリプトを正常に実行できました。したがって、シェバング行はない介してPythonスクリプトを実行する際に必要なpython、またはpython3コマンド。

方法2:Pythonスクリプトとして実行

以下は、shebang行でソースコードを実行した場合のコマンドと出力です。これらは、非実行可能および実行可能の場合を含め、Python 2とPython 3のどちらにも適合していません。

$  ./hello1.py
bash: ./hello1.py: Permission denied

$  ./hello2.py
bash: ./hello2.py: Permission denied

$  ./hello3.py
bash: ./hello3.py: Permission denied

$  ./hello2e.py 
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2]
Hello, World!

$  ./hello3e.py 
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09) 
[GCC 4.8.4]
Hello, World!

最初の3つのスクリプトは、shebang行があるかどうかに関係なく、これらのスクリプトが実行可能でないため失敗しました(サポートの証拠については以下の追加例を参照してください)。最後の2つのスクリプトにはシェバン行があり、実行可能です。

どうやら、実行可能にされたスクリプトは、本質的にシェバン行がなければ役に立たない。したがって、実行可能なスクリプトでPythonコードを実行する場合、shebang行が必要であり、スクリプトが実行可能である必要があります。

シバンが機能しないとき

準備とテストの例でhello3m.pyは、実行可能スクリプトとして実行すると失敗し、エラーが返されました。

$  ./hello3m.py 
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory

これは、shebangが機能しないか無効になるという既知の制限です。ファイルをUnicode BOM(バイトオーダーマーク)として保存すると、実行可能なPythonスクリプトとして正常に実行できません。

追加の例

この追加の例は、証拠の裏付けとしてのみ扱われます。結果は無害ですが、ユーザーはこの例を実行しないでください。

という名前の別のファイルを作成しました。hello1e.pyこれには、同じファイルが含まれhello1.py、実行可能になっています。このスクリプトを実行すると、構文エラーが返されました。

$  ./hello1e.py 
./hello1e.py: line 2: syntax error near unexpected token `"Hello from Python %s\n"'
./hello1e.py: line 2: `sys.stdout.write("Hello from Python %s\n" % (sys.version,))'

このスクリプトを実行すると、最初はマウスカーソルがプラス記号に変わり、外観は何もしません。デスクトップまたはターミナルウィンドウをクリックするまで、構文エラーは表示されません。次に、このスクリプトは、スクリプトとsys同じディレクトリにファイルを作成します。

$  file sys
sys: PostScript document text conforming DSC level 3.0, Level 1

sysファイルは、ファイル拡張子なしで、PostScriptファイルとして同定されています。このファイルは、ドキュメントビューア、つまりEvinceで開くことができます。ファイルには、以前にクリックしたウィンドウのスクリーンショットが実際に含まれていました。私の経験では、ファイルは数メガバイトにもなります。

繰り返しますが、シェバン行が必要であり、スクリプトは、実行可能スクリプトとしてPythonスクリプトを実行するときに実行可能でなければなりません。そうしないと、スクリプトは上記のように誤動作します。

その他の注意事項

「実行可能にする」または「実行可能にする必要がある」という用語は、スクリプトを実行する権限を指します。これはchmod +x FILENAME、ターミナルでコマンドを実行するか、ファイルマネージャー内の[ プロパティ]ウィンドウで[このファイルをプログラムとして実行する]オプションまたは同様のオプションをオンにすることで実行されます。

他の既存の答えはほとんどすべてを網羅していましたが、この答えは実際の例を使用して問題を説明することにより、異なるアプローチを取りました。コード構文は慎重に作成されているため、Python 2またはPython 3のいずれかを使用してサンプルを実行できます。

Pythonコードは、「WindowsPython使用」および「UnixプラットフォームPython使用」から、ユビキタスな「Hello、World!」の追加の1行コードで適応されました。プログラム。

すべてのコードとコマンドは完全にテストされており、Python 2.7およびPython 3.4がデフォルトでインストールされているXubuntu 14.04システムで動作します。


4

これは、そのファイルが実行されると、コンピューターがプログラムを使用して実行することを知っていることを意味し/usr/bin/pythonます。これは、bashなどの別の言語と区別するためです#!/bin/bash。これは、単に実行できるようにするためです。

./[file-to-execute]

そして、あなたはあなた自身が次のようなもので指定する必要があるのではなく、それを実行するファイルを知っています。

python ./[file-to-execute].py

その#!部分は一般的にシバングまたはクランチバングと呼ばれます。


2
また、hashbang。
ナフトゥリケイ

1

複数のバージョンのPythonがインストールされている場合/usr/bin/env、使用するインタープリターが環境の最初のインタープリターであることを確認します$PATH。別の方法は、次のようなハードコードにすることです#!/usr/bin/python

Unixでは、解釈されることを意図した実行可能ファイル#!は、最初の行の先頭にを付け、その後にインタープリター(および必要なフラグ)を付けることで、使用するインタープリターを示すことができます。

このルールは、UNIXベースのシステムにのみ適用されます。


0

Python 2.xがまだ標準であるLinuxのようなOSに役立ちますが、ほとんどの人は3.xもダウンロードします。

2.xはデフォルトで実行されます。3.xのコードでは、#!/ usr / bin / env python3というプレフィックスを付けて、3.xでコードが実行されるようにします。ベータリリースまたはわずかに古いバージョンを選択した場合は、マイナーリビジョン(python 3.xyz)まで指定することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.