akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python 先頭行のシバン行(#!)とは

はじめに

ここでは、Pythonスクリプトの先頭行に記述されるシバン行というものについて説明します。

シバン行とは

シバン(shebang)行とはPythonスクリプトの先頭行のことで、このスクリプトを実行するのがPythonであることをコンピュータに伝える働きをします。
シバン行は#!から始まります。

  • シバン行の例
#! python3

print( 'Hello world' )

書き方

各OSの書き方

シバン行の書き方はOSに依存します。

#! python3
#! /usr/bin/env python3
#! /usr/bin/python3

バージョンの指定方法

バージョンの指定方法は共通です。以下はWindowsの例です。

  • インストール済のPython3の中で最新のバージョンを指定
#! python3
  • バージョン3.6を指定
#! python3.6


Python2の場合も同様に指定可能です。


Pythonはマイナーバージョン単位でインストールされるため、指定できるのはマイナーバージョンまでです。例えば下記のような記述はエラーとなります。

#! python3.6.8    これはエラー

また、インストールされていないバージョンを指定した場合もエラーとなります。

用途

OSによる違い

シバン行はPython独自の機能ではなく、UNIX系においてスクリプトを実行するインタプリタを指定するための機能です。

そのため、どちらかといえばMacLinux向けの機能であり、WindowsMacLinuxでは用途が異なります。

MacLinuxでの用途

基本的に必須

MacLinuxでは以下のようにスクリプトを実行しますが、スクリプトを実行するインタプリタを指定するためにシバン行を記述する必要があります。

./pythonScript.py
不要な場合もある

PythonのPATHを通していれば、コマンドラインから下記のように記述することでシバン行がなくても実行可能です。

python pythonScript.py

ただし、複数のバージョンのPythonをインストールした場合にこの方法では対応できないのと、スクリプトの再利用性の観点からMacLinuxではシバン行を記述した方が良いと思います。

Windowsでの用途

基本的に不要

Windowsでの用途はごく一部に限られているため、シバン行を記述しなくても問題ありません。
シバン行は#から始まるため、Pythonスクリプト上はコメントと同じ扱いとなります。

シバン行を利用する目的

Windowsでシバン行を利用する目的は以下の通りです。

- 実行するPythonのバージョンをスクリプトから指定したい

複数バージョンのPythonがインストールされている環境では、py.exe*1を利用することでスクリプトを適切なバージョンのインタプリタpython.exe)で実行できます。
py.exeはシバン行の読み込みに対応しており、シバン行をもとに実行するインタプリタを選択します。

py pythonScript.py


なお、py.exeではシバン行がない場合はインストールされている最新のインタプリタが選択されますので、シバン行を記述しなくても問題ありません。
また、コマンドラインからバージョンを指定することもできます。コマンドラインとシバン行をどちらも記述した場合は、コマンドラインが優先されます。

  • インストール済のPython3の中で最新のバージョンを指定
py -3 pythonScript.py
  • バージョン3.6を指定
py -3.6 pythonScript.py


少し試すレベルであればコマンドライン指定で問題ないかと思いますが、バージョンが明確に決まっている場合はスクリプト上に記述したほうが分かりやすいですし、実行時の手間も減ると思います。


- 開発時のPythonのバージョン情報を残しておきたい
Windowsユーザで1つのバージョンのPythonしかインストールしていない場合など、シバン行が直接必要ない場合もあるかもしれません。

一方で、情報共有という観点では、シバン行は有益な情報源となります。スクリプトを再利用したり第三者に配布する可能性がある場合、シバン行を記述しておくと後々役に立つかもしれません。
Pythonはバージョンによって動作が異なる場合がありますので、スクリプト上から開発時のバージョンがわかればデバッグ時に参考になります。
最低限、Python2かPython3かどうかは分かるようにしておくと良いと思います。

*1:Pythonの実行ランチャ。Python3.3以降のバージョンでインストールされる。Anacondaなどのディストリビューションでには含まれない