Pythonの複数バージョンの扱い方(Windowsの場合)

Pythonは、マイクロバージョンだけアップグレードしている限りはバージョンを意識しないで使い続けられます(すなわち、3.6.1 ▶ 3.6.2 ▶ 3.6.3 のようなアップグレードだけを行う)。

しかし、Pythonとの付き合いが長くなると、どうしても 3.5 ▶ 3.6 のように新しいバージョンに移行することになり、その結果1台のマシンに複数バージョンのPythonが存在するようになってしまいます(例えば、3.3、3.5、3.6)。

バージョンアップしても、問題なく以前のプログラムが動いてくれればよいのですが、動かなくなった場合には、バージョンを切り替えて運用する方法を検討することになります(そのためにも、旧バージョンはアンインストールしないでください)。

バージョン管理の問題は、分かりやすいPythonのなかで、例外的に扱いにくい所です。他のプログラミング言語に慣れている場合、とても煩わしく感じます(実は私も当初この問題のせいで、Pythonに二の足を踏んでいました。でも、今はPythonの自由な一面だと考えています)。

言い換えれば、この問題を解消すれば、Pythonはさらに身近になります。

そして嬉しいことに、Windows版のPython3.3からデフォルトでインストールされるPythonランチャーpy.exe)のおかげで、とても扱いやすくなりました。ここでは、Pythonランチャーによる複数バージョンの扱い方を説明します。

Macにはpyenv

Macで複数バージョンを管理するには、pyenvが便利です。Homebrewで簡単にインストールできます。
pyenv : Simple Python version management

本サイトでは仮想環境については触れません

モジュール(ライブラリ)についても、バージョンアップに伴う互換性の問題があります。通常は、pyvenvコマンドを用いて、プロジェクトごとに仮想環境を作成することで、この問題に対応します。

しかし、仮想環境はなかなか理解しづらく、一般のビジネスマンを対象にしている本サイトでは扱いません。ですが、本サイトではメジャーなライブラリばかり使用しており、互換性に配慮されていることが多いので、問題は少ないと考えています(場合により、軽微な修正で対応)。

Pythonのバージョンアップ(グレードアップ)の種類

まず、Pythonのバージョンアップには、どのような種類があるかまとめておきます。

Python2 ▶ Python3のような、メジャーバージョンは滅多にアップグレードされませんが、以下の2つの新しいバージョンは比較的よくリリースされています。

  1. 新しいマイナーバージョン(例:3.53.6
  2. 新しいマイクロバージョン(例:3.6.33.6.4

マイナーバージョンは、いわゆる「機能リリース」に相当し、比較的大きな改善などが実施されます。新しいバージョンは、既存のバージョンとは別にインストールされます。概ね18箇月ごとにリリースされます。

一方、マイクロバージョンは、「バグ修正リリース」に相当し、新しいバージョンをインストーラーの通りにインストールすると旧バージョンは置き換えられます。概ね6箇月ごとにリリースされます(状況によりもっと頻繁に実施されることもあります)。

マイクロバージョン間については、互換性が保証されています。すなわち、3.6.3で動作するプログラムは、3.6.4でも問題なく動きます。

インストール先はマイナーバージョンごと

インストーラーの通りにインストールすると、インストール先は以下のようにマイナーバージョンごとになります。すなわち、3.6.33.6.4で上書きされます。

python install directory

Python35-32は、Pytyon3.5の32ビット版の意味です。

マイクロバージョン間ではインストーラーはアップグレードを促す

3.6.3がインストールされている状態で、3.6.4をインストールしようとすると、アップグレード用の画面が表示されます。ここで、「Upgrade Now」を選択すると、設定はそのままの状態で3.6.4にアップグレードできます。

python upgrade

pyファイルはPythonランチャーに関連付けられる

Windowsでは*.pyをダブルクリックするだけでPythonを実行できますが、その時直接オリジナルのpython.exeの方ではなく、py.exePythonランチャー)が呼び出されます。

以下のように、*.pyにC:¥Windowsにあるpy.exeが関連付けられているのがわかります。

python version up py ext

コマンドプロンプトを開いて、assocコマンドで、py拡張子に関連付けられている「ファイルタイプ」を調べ、ftypeコマンドでそのファイルタイプがどのプログラム実行に定義されているかを確認できます。

Pythonランチャーは、複数のバージョンのなかから、一番新しいバージョンで実行してくれます。

例えば、3.53.6がインストールされているマシンで、PATHで3.5の方が優先される場合でも、以下のようにPythonランチャーでは新しい3.6が実行されます。

py default versions

PythonランチャーではPythonフォルダのPATH登録は不要

コマンドプロンプトで、pythonコマンドを実行(例えば、上記のpython -V)するには、インストール時に「Add Python 3.x to PATH」をチェックして、PytyonフォルダをPATHに登録する必要があります。

一方、Pythonランチャーは、PATHに登録されていなくても、インストールされているPythonを探してくれます。従って、インストール時に「Add Python 3.x to PATH」にチェックしなくても構いません。

PATHに登録されている場合は、上の例のようにpythonpyで違うバージョンを指してしまうので、特にpipを使う場合に注意が必要です。

pip install pypdf2       <= Pytyon 3.5にインストールされる
py -m pip install pypdf2 <= Python 3.6にインストールされる

従って、混同しないようにするには、PATHを登録しない(登録している場合は「システム詳細設定」で削除する)方が得策です。

PythonフォルダがPATHに登録されていなければ、pythonpipを入力するとエラーになるので、pyを使用することになります。

バージョンを切り替える方法

バージョンの切り替えが必要になるケースは以下の2つが考えられます。

  1. 新しいバージョンのPythonをインストールしたら、以前のプログラムが動かなくなった。
  2. Pythonのバージョンを指定して、pipでライブラリのインストールや確認をしたい。

そして、Pythonの実行バージョンを切り替えるには、以下の2つの方法があります。

  1. ファイルごとに切り替える
  2. コマンドごとに切り替える ▶ pip を用いる場合はこちら

1. ファイルごとに実行バージョンを切り替える

例えば、「今までバージョン3.5を使用していて、3.6にグレードアップしたら、一部のPytyonプログラムが動かなくなった。動かなくなったプログラムだけは、3.5のまま使用したい。」そのような場合は、プログラムファイルの先頭に以下の1行を付けてください。

#!python3.5

このPythonプログラムファイル(*.py)をダブルクリックすると、Pythonランチャーがこの先頭行を解釈して、3.5で実行してくれます(3.5はインストールされている必要があります)。

3.33.4で実行したい場合は、#!python3.3#!python3.4を先頭に付ければよいのです。

この#!で始まる行は、Shebang(シバンまたはシェバン)と呼ばれ、元はUnix系システムにおいて、実行するプログラムを指定するのに使われていますが、WindowsではPythonランチャーが擬似的に解釈してくれます。

Shebangについて、詳しくは以下の記事を参照してください。

WindowsユーザーがPythonプログラムを見てまず疑問に思うのは先頭の#!で始まる行の意味です。 #!/usr/bin/env python3 # get_news.py グーグルホーム…

2. コマンドごとに実行バージョンを切り替える

コマンドごとに切り替える場合は、以下のようにpyの後にバージョンを指定します。ここで、sample.pyはカレントディレクトリ(C:¥Works¥py)にあるとします。

C:¥Works¥py> py -3.5 sample.py

先頭行のShebangでもバージョンが指定されている場合は、コマンドの方が優先されます。つまり、sample.pyの先頭に、#!python3.3と入力されていても、上のコマンドでは3.5で実行されます。

通常、コマンドで毎回バージョンを指定するのは面倒なので、Shebangでファイルごとに切り替えることが多いです。しかし、pipを使う場合にはコマンドでの切り替えます。

例えば、3.53.6がインストールされている環境で、旧バージョンの3.5の方にライブラリをインストールする場合は、以下のようにバージョンを明示する必要があります。

py -3.5 -m pip install pypdf2

py -m pip install pypdf2  <= 3.6の方にインストールされる

pipについて、詳しくは以下の記事を参照してください。

Pythonには豊富な標準ライブラリが備わっています。システム、ファイルIO、関数、データベース、ウェブ等、非常に多彩です。Pythonが「バッテリー同梱(batteries included)」と呼…