非常に簡単な質問:Linuxでは、なぜPythonに次の行が必要なのですか?
#!/usr/bin/python
Windowsはそうではないので、Pythonファイルの開始時に?
それは何をするためのものか?「「Pythonへのリンク」という説明は少しあいまいなので...
python myscript.py
代わりにいつでも実行できます。
非常に簡単な質問:Linuxでは、なぜPythonに次の行が必要なのですか?
#!/usr/bin/python
Windowsはそうではないので、Pythonファイルの開始時に?
それは何をするためのものか?「「Pythonへのリンク」という説明は少しあいまいなので...
python myscript.py
代わりにいつでも実行できます。
回答:
Pythonには、Linuxではそのような特別な要件はありません。呼ばれているように、「shebang」行を使用するのは、Unix / Linux上のプログラムローダーです。これは実際には制限ではなく機能ですが、すぐにそれを説明します。「shebang」のWikiページには詳細がありますが、ここでは概要とWindowsとの比較について説明します。
まず、Windowsの状況を見てみましょう。
.
ですPythonファイルの場合、これは通常.py
です。.py
、新しくインストールされたアプリケーション Python(Pythonインタープリター)を使用してファイルを開く必要があることをWindowsに通知します。.exe
、.bat
ファイルはWindowsバッチスクリプトとして実行されます。.py
ファイルを実行する代わりにpython.exe
、テキストエディターなどの他のプログラムでファイルを開くように指示できますnotepad.exe
。
python <scriptname>.py
(または.bat
これを行うファイルを作成する)必要があります。さて、Pythonスクリプトの先頭にシェバン行(#!/usr/bin/python
または#!/usr/bin/env python
)があるとどうなりますか?以来、まあ、#
Pythonでコメント行で、Pythonインタプリタはそれを無視します。これが、Unix / Linuxの世界で使用されるほとんどのスクリプト言語が#
コメント行の開始に使用する理由の1つです。
そのため、Windowsがその#!
行を「必要としない」と言うのは少し誤解を招きます。Windowsはしない参照#!
ラインを、実際に何をすべきか、それを伝えるために、ファイルの拡張子に依存しています。これにはいくつかの欠点があります。
.py
ます。.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はPythonスクリプトを実行するためにshebang行を必要としない ことに注意してください。実際に実行されるのは、プログラムローダーがインタープリターを選択できるようにすることだけです。ただし、Windowsと同様に、これは手動で行うことができます。
python <myscript>
.py2
と.py3
3つのスクリプトをPythonの2 / Python用の拡張機能。そのため、Linux(+ xビット)とWindows(ファイル拡張子)の両方にファイルシステムのメタデータが必要です。主な違いは、+ xビットが転送中により簡単に失われることです。これは必ずしも欠点ではありません。
/usr/bin/i686/python
や/usr/bin/amd64/python
?完全に合理的ですが、でハードコードされた仮定を持つpythonスクリプトを壊し/usr/bin/python
ます。インタプリタの選択は、スクリプト作成者の選択ではなく、スクリプトユーザーの選択です。スクリプト作成者は言語(方言)を選択するだけです。
/usr/bin/env
はenv-setupスクリプトと一緒に使用するものです。これのWindowsバージョンは何ですか?ファイルをregedit
起動する直前にスクリプトを実行して、.py
必要なインタープリターを確実に取得しますか?
指定した行は、ファイル/スクリプトを直接実行するときに使用するプログラム/インタープリター、およびスクリプトの実行時にそのプログラムに渡す必要のある引数をコンピューターに伝えるために使用されます。ただし、これは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などの他のスクリプト/言語の場合、または同様の操作を行う必要があります。)
上記の構文の強調表示は、各セクションで言語固有ですが、実際には重要ではありません。
#!/bin/bash -x
、#!/usr/bin/perl -lan
など)。
/usr/bin/env python
、正しいPythonを取得する(使用する)ときにPITAでした。
env
ですが、問題は引数の数ではないようです#!/usr/bin/perl -l -a -n
。3つの引数がありますが、動作します。繰り返しますが、私は正確な問題を理解することはできません。
./
。言い換えれば、ちょうどpython filename.py
またbash script.sh
はうまく動作します。含める唯一の理由./
は、コマンド名にあります。シェルに検索しないように$PATH
(おそらく現在のディレクトリでファイルを見つけられないように)シェルに伝えたいが、指定したパスをそのまま使用する場合です。しかし、それはコマンド引数には適用されません。
env
、カーネルから残りの引数をどのように受け取るかにあります。それらはすべて、スペースによる分割が実行されていない1つの大きな引数であると推定できます。はっきり言って申し訳ありませんが、これの詳細はもうよく覚えていません
この線:
#!/usr/bin/python
「シェバン」と呼ばれ、ファイル内の残りのコマンドを解釈するために使用されるインタープリターバイナリへのパスを示します。通常、スクリプトの最初の行です。
そのため、この行#!/usr/bin/python
は、ファイルの内容がにあるpython
バイナリによって解釈されることを示しています/usr/bin/python
。
シェバン行はカーネルによって解析され、その後スクリプトは最終的に引数として呼び出されることに注意してください。
python script_name
同様の場合#!/bin/bash
:
bash script_name
shebang
。単語は「ハッシュ」と「バング」から形成されるため、スペルは「she」と「bang」の組み合わせのように見えるため、あまり明確ではありません。
hashbang
(#
= "hash")またはshebang
(#
= "sharp")と呼ぶことができます#
。しかし、shebang
実際にはより一般的です。@KyleStrand
技術的には、それは必要ありません。スクリプトを実行する環境へのパスが必要です。今後のスクリプトでは、/ 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
Python 2.Xまたはpython3
Python 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つの既知の理由があります。
実行可能スクリプトでPythonコードを実行するには、つまり、コードの実行方法と、どのインタープリターを使用するかを定義します。
特定のバージョンの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コードは、「WindowsでPythonを使用」および「UnixプラットフォームでPythonを使用」から、ユビキタスな「Hello、World!」の追加の1行コードで適応されました。プログラム。
すべてのコードとコマンドは完全にテストされており、Python 2.7およびPython 3.4がデフォルトでインストールされているXubuntu 14.04システムで動作します。
これは、そのファイルが実行されると、コンピューターがプログラムを使用して実行することを知っていることを意味し/usr/bin/python
ます。これは、bashなどの別の言語と区別するためです#!/bin/bash
。これは、単に実行できるようにするためです。
./[file-to-execute]
そして、あなたはあなた自身が次のようなもので指定する必要があるのではなく、それを実行するファイルを知っています。
python ./[file-to-execute].py
その#!
部分は一般的にシバングまたはクランチバングと呼ばれます。
.
)に依存して、どのような種類のファイルかを判断します。Windowsでさえ、これから遠ざかりつつあります。MicrosoftWordファイルの最初の数行を調べると、実際にはMicrosoft Wordファイルであると表示されます。