非常に簡単な質問:Linuxでは、なぜPythonに行が必要ですか
#!/usr/bin/python
windowsはそうではないので、pythonファイルの開始時に?
それは何をしますか? '「Pythonへのリンク」という説明は少し曖昧だからです...
Pythonは、Linuxではそのような特別な要件はありません。 Unix/Linuxでプログラムローダーと呼ばれるのは、「Shebang」行を使用するためです。これは実際には制限ではなく機能ですが、すぐにそれを説明します。 「Shebang」のWikiページに詳細があります ただし、ここではWindowsとの比較だけでなく概要も説明します。
まず、Windowsの状況を見てみましょう:
.
で始まるファイル名のlast部分です。Pythonファイルの場合、これは通常.py
です。.py
ファイルは新しくインストールされたapplication Python(つまりPythonを使用して開く必要があることをWindowsに伝えます。 _インタープリター)。.exe
で終わる必要があり、.bat
ファイルはWindowsバッチスクリプトとして実行されます。.py
を使用してpython.exe
ファイルを実行する代わりに、テキストエディターnotepad.exe
。などの他のプログラムでそれらを開くように指示できます。python <scriptname>.py
を呼び出す(または.bat
ファイルを作成してこれを行う必要があります) )。では、Pythonスクリプトの先頭にShebang行(#!/usr/bin/python
または#!/usr/bin/env python
)があるとどうなりますか?まあ、#
はPythonのコメント行なので、Pythonインタープリターはそれを無視します。これが、Unix/Linuxの世界で使用されるほとんどのスクリプト言語が#
を使用してコメント行を開始する理由の1つです。
したがって、Windowsが#!
行を「必要としない」と言うのは少し誤解を招きます。 Windowsはsee#!
行を使用せず、実際にはファイル拡張子に依存して何をすべきかを指示します。これにはいくつかの欠点があります。
.py
を付けて、自動的に認識されるようにします。.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
やテキストエディターなど、インタープリター以外のものでもかまいません)。ファイルを実行しようとすると、次のようになります。
#!
の場合、ローダーはシバン行の残りの部分(シバン自体を除く)を、スクリプトとしてファイルの内容を実行するinterpreterを起動するコマンドとして解釈します。これにはいくつかの利点があります。
最後に、Unix/LinuxはPythonを実行するためにShebang行をnotneedすることに注意してください_ 脚本。 Shebang行が実際に行うことは、プログラムローダーにselectインタープリターを許可することだけです。ただし、Windowsと同様に、これは手動で行うことができます。
python <myscript>
指定した行は、ファイル/スクリプトを直接実行するときに使用するプログラム/インタープリター、およびスクリプトの実行時にそのプログラムに渡す必要のある引数をコンピューターに伝えるために使用されます。ただし、これは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などの他のスクリプト/言語の同様の操作を行う必要があります。)
上記の構文の強調表示は、各セクションで言語固有ですが、実際には重要ではありません。
この線:
#!/usr/bin/python
「シェバン」と呼ばれ、ファイル内の残りのコマンドを解釈するために使用されるインタープリターバイナリへのパスを示します。通常、スクリプトの最初の行です。
したがって、#!/usr/bin/python
行は、ファイルの内容が/usr/bin/python
にあるpython
バイナリによって解釈されることを示しています。
Shebang行はカーネルによって解析され、最終的にスクリプトは引数として呼び出されることに注意してください。
python script_name
同様に#!/bin/bash
の場合:
bash script_name
技術的には、それは必要ありません。スクリプトを実行する環境へのパスが必要です。今後のスクリプトでは、/ usr/bin/envを含めてからpythonを指定する方が良いでしょう。これにより、pythonがインストールされている場所に関係なく、スクリプトがpython環境で実行されることが付与されます。互換性の理由でこれを実行したい場合、コードを共有する次の人がpythonをusr/bin/pythonにインストールしたか、それらのシステムファイルへのアクセス許可を持っているかを確認できません。
スクリプトでは次のようになります。
#!/usr/bin/env python
Python3を指定する方法についても懸念があります。方法は次のとおりです。
#!/usr/bin/env python3
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つの既知の理由があります。
実行可能なスクリプトでPythonコードを実行します。つまり、コードの実行方法と、どのインタープリターを使用するかを定義します。
特定のバージョンの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.py
はhello2.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システムで動作します。
そのファイルが実行されると、コンピューターはプログラム/usr/bin/python
で実行することを知っているので、#!/bin/bash
を実行するbashなどの別の言語と区別することができます。これは、単に実行できるようにするためです。
./[file-to-execute]
そして、あなたはあなた自身が次のようなもので指定する必要があるのではなく、それを実行するファイルを知っています
python ./[file-to-execute].py
#!
部分は、一般的にShebangまたはcrunch bangと呼ばれます。
Pythonの複数のバージョンがインストールされている場合、/usr/bin/env
は、使用するインタープリターが環境の$PATH
の最初のものであることを確認します。別の方法としては、#!/usr/bin/python
のようなものをハードコーディングすることです。
Unixでは、解釈対象の実行可能ファイルは、最初の行の先頭に#!
があり、その後にインタープリター(および必要なフラグ)が続くことにより、使用するインタープリターを示すことができます。
このルールは、UNIXベースのシステムにのみ適用されます。
Python 2.xがまだ標準であるLinuxなどのOSに役立ちますが、ほとんどの人は3.xもダウンロードします。
2.xはデフォルトで実行されます。 3.xのコードでは、#!/ usr/bin/env python3というプレフィックスを付けて、3.xでコードが実行されるようにします。ベータリリースまたはわずかに古いバージョンを選択した場合は、マイナーリビジョン(python 3.x.y.z)まで指定することもできます。