Pythonプログラムの先頭行の #! シバン(Shebang)について

WindowsユーザーがPythonプログラムを見てまず疑問に思うのは先頭の#!で始まる行の意味です。

#!/usr/bin/env python3
# get_news.py グーグルホームの最新ニュースを取得するプログラム

import requests
url = "https://news.google.com/news/headlines?hl=ja&ned=jp"
response = requests.get(url)
............

この#!Shebang(シバンまたはシェバン)と呼ばれます。これは、Unix系システムにおいて、ファイルに書かれたプログラム文をどうやって実行するかを指定しています。

つまり、上記のShebangは以下のコマンド実行に相当します。

/usr/bin/env python3 get_news.py

python3と明記することで、バージョン2と3のPythonの両方がインストールされている環境において、バージョン3の方でこのプログラムを実行できます。Pythonは#で始まる行をコメントと見なすので、Shebang自体は無視され、プログラム文だけPython3で実行されます。

では、WindowsユーザーはShebangを書く必要があるのでしょうか。基本的には必要ありません。ただし、以下の場合には、必要になります。

WindowsユーザーでもShebangを付けるケース
  1. ファイルごとに実行するPythonのバージョンを変えたい場合
  2. MacやLinuxのユーザーとコードを共有したい場合

ここでは、以下のPythonの実行バージョンを表示するプログラムを利用して、それぞれのケースについて動作を検証してみます。

検証に用いるPythonの実行バージョンを表示するプログラム
myver.py
#!/usr/bin/env python3 <= この先頭行(Shebang)を以下の検証ごとに変えます。
import sys
print(sys.version.split()[0])

ファイルごとに実行するPythonのバージョンを変えたい場合

Pythonは1つのマシンに複数のバージョンをインストールできます。例えば、2.73.33.53.6を同じマシンにインストールできます。

このサイトではPython3(3.*)を対象にしていますが、同じPython3でも3.5 ▶ 3.6にバージョンアップしたら、3.5の時のプログラムが動かなくなってしまうことがあります。

その場合には、プログラムを3.6対応に修正する方法もありますが、それは面倒なので出来れば書き直さないで、そのプログラムだけは3.5で実行させたいです。そんな時にShebangを使います。

以下のように、#!python3.5を先頭行に挿入すれば、このファイルだけ3.5で実行できます。

#!python3.5
import sys
print(sys.version.split()[0])

ファイルをダブルクリックで実行できますが、コマンドプロンプトのウィンドウがすぐに閉じてしまうので、コマンドプロンプトのウィンドウをあらかじめ開いてから、以下のように実行します。

C:¥mypy> myver.py
3.5.2 

3.5ではなく単に#!python3だけであれば、インストールされているPython3のなかで最新のバージョンで実行されます。

C:¥mypy> myver.py
3.6.1 

Windows自体はShebangをサポートしていませんが、Pythonランチャーが仮想的に解釈してくれます。なお、上記のShebangのパターンは、MacやLinuxでは動作しません。MacやLinuxユーザーとコードを共有する場合は、次の項を参考に/usr/で始まるパターンを使用してください。

Windows版Pythonランチャー

以前は、Windowsユーザーにとって、バージョンの切り替えは非常に面倒なものでしたが、Python3.3からのWindows版Pythonランチャーのお陰で、この切り替えがとても簡単になりました。

Windows版Pythonをインストールすると拡張子.pyにこのPythonランチャー(py.exe)が自動的に関連付けられます。つまり、myver.pyをダブルクリックすると、以下のコマンドが実行されます。

C:¥mypy> py myver.py 

WindowsのPythonプログラムはバージョン毎にあるpython.exeで実行します。Pythonランチャーを介することで、適当なバージョンのpython.exeで実行してくれます。

Pythonランチャーに実行バージョンを指示するには、以下の2通りの方法があります。

  1. Shebangでバージョンを指定する(ファイルごとの指定
  2. コマンドラインでバージョンを指定する(コマンドごとの指定
(参考)コマンドラインからのバージョン指定方法

Shebangはファイルごとにバージョンを指定できますが、一時的に指定して実行したい場合にはコマンドラインを使用します。両方で指定されている場合は、コマンドラインの方が優先されます。

例えば、2.73.53.6 の3つがインストールされている場合、以下のようにpyの後(py -v)で簡単に指定できます。ここで、3.*のバージョンが複数ある場合、py -3 とだけ指定すると、新しい方の3.6で実行されます。

C:¥mypy> py -2 myver.py
2.7.10
C:¥mypy> py -3 myver.py
3.6.1
C:¥mypy> py -3.5 myver.py
3.5.2 

MacやLinuxユーザーとコードを共有したい場合

Windowsでは、拡張子.pyPythonランチャー(py.exe)に関連付けられているので、Pythonファイルをダブルクリックすれば実行できます。

一方、MacやLinuxのようなUnix系システムでは、ターミナルという端末ウィンドウで、ファイルをパスから指定すると実行できます。すなわち、カレントディレクトリにあるファイルは、ファイル名の前にカレントディレクトリを表す./を付けると実行できます。

まずShebangのないプログラムファイル(myver.py)を実行してみます。

$ ./myver.py
$ (実行できない)<=エラー表示内容は環境により異なる

Shebangがないと何で実行したらよいか分からないので、プログラム文がそのまま実行されてしまい、エラーが表示されます。

そこで、以下のようにShebangを先頭に加えて実行してみます。

#!/usr/bin/env python3.5
import sys
print(sys.version.split()[0])

するとプログラム文はPython3.5で実行され、以下のようにバージョンが表示されます。

$ ./myver.py
3.5.2

このようにMacのようなUnix系システムでは、Shebangが先頭行にないとファイルだけで実行できません。従って、WindowsーMac・Linuxユーザーの間で、Pythonコードを共有する場合は、Shebangを付けてください。

なお、Windows版のPythonランチャーが解釈できるUnixのShebangは以下の3パターンだけですので、MacやLinuxの実行環境を考慮して以下のどれかを使用してください。

#!/usr/bin/env python
#!/usr/bin/python
#!/usr/local/bin/python

通常は、比較的柔軟に対応できる#!/usr/bin/env pythonを利用するのが一般的です。

実行権限の付与を忘れずに

MacとLinuxで、ファイルを実行するには以下のように実行権限を付与する必要があります。

$ chmod +x myver.py