web-dev-qa-db-ja.com

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

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

#!/usr/bin/python

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

それは何をしますか? '「Pythonへのリンク」という説明は少し曖昧だからです...

50
TellMeWhy

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

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

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

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

したがって、Windowsが#!行を「必要としない」と言うのは少し誤解を招きます。 Windowsはsee#!行を使用せず、実際にはファイル拡張子に依存して何をすべきかを指示します。これにはいくつかの欠点があります。

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

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

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

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

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

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

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

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

最後に、Unix/LinuxはPythonを実行するためにShebang行をnotneedすることに注意してください_ 脚本。 Shebang行が実際に行うことは、プログラムローダーにselectインタープリターを許可することだけです。ただし、Windowsと同様に、これは手動で行うことができます。

python <myscript>
58
Kyle Strand

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

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


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

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

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


ただし、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などの他のスクリプト/言語の同様の操作を行う必要があります。)

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

41
Thomas Ward

この線:

#!/usr/bin/python

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

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

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

python script_name

同様に#!/bin/bashの場合:

bash script_name
16
heemayl

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

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

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

#!/usr/bin/env python

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

#!/usr/bin/env python3
7
j0h

Linuxでは、Pythonは#!(Shebang)行を必要とする場合と必要としない場合があります。これは、PythonコードがPythonインタラクティブモードで実行されるか、Pythonスクリプトで実行されるかによって異なります。

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

$  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コードをプレーンテキストファイルに書き込んで保存し、後でコードを実行できます。これには、Shebangラインが必要な場合と必要でない場合があります。ただし、LinuxでPythonスクリプトを使用するためにShebang行が必要な場合、2つの既知の理由があります。

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

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

Pythonスクリプトの練習

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

$  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には、ソースコードとShebang行が含まれています。

    #!/usr/bin/env python
    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
    
  • hello2e.pyにはhello2.pyと同じ内容が含まれ、実行可能になりました。

  • hello3.pyhello2.pyと同じですが、最初の行の名前を#!/usr/bin/env python3に変更することでPython 3で実行するようになっています。

  • 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またはpython3コマンドを介してPythonスクリプトを実行する場合、Shebang行はnotが必要です。

方法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つのスクリプトにはShebang行があり、実行可能です。

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

シバンが機能しない場合

準備とテストの例では、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で開くことができ、ファイルには実際に、以前にクリックしたウィンドウのスクリーンショットが含まれていました。私の経験では、ファイルのサイズは数メガバイトにもなります。

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

追加のメモ

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

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

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

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

5
clearkimura

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

./[file-to-execute]

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

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

#!部分は、一般的にShebangまたはcrunch bangと呼ばれます。

4
user364819

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

Unixでは、解釈対象の実行可能ファイルは、最初の行の先頭に#!があり、その後にインタープリター(および必要なフラグ)が続くことにより、使用するインタープリターを示すことができます。

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

1
orvi

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

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

0
user21784