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

[PR]本ページには広告が含まれています

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の実行バージョンを表示するプログラムを利用して、この2つのケースについて動作を検証してみます。

myver.py
#!/usr/bin/env python3 <= この先頭行(Shebang)を以下の検証ごとに変えます。
import sys
print(sys.version.split()[0])

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

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

このサイトではPython3を使用していますが、同じ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:¥Users¥Taro> myver.py
3.5.2 

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

#!python3
import sys
print(sys.version.split()[0])
C:¥Users¥Taro> 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)が関連付けられます。つまり、ダブルクリックで実行できます。

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:¥Users¥Taro> py -2 myver.py
2.7.10
C:¥Users¥Taro> py -3 myver.py
3.6.1
C:¥Users¥Taro> 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