やったこと

既にPythonのバージョン3.7.xが入っているWindowsPCにて、最近(2019.10.18現在)リリースされたPython3.8をインストールした。その際、numpyなどを入れ直した。

Python3.7.x系のパッケージを控える

インストーラを起動して新しいPython3.8のほうにpathが通ると、pip listをしてもそれは新しい方、3.8に紐づいているパッケージリストしか表示されないということがあり得る。従って、インストーラを起動する前にpip list > packages.txtなんかをやっておいてパッケージリストを控えておいた。

λ python --version
Python 3.7.3

λ pip list > packages.txt

λ cat packages.txt
Package             Version
------------------- ----------
absl-py             0.6.1
astor               0.7.1
certifi             2018.4.16
chardet             3.0.4
cycler              0.10.0
gast                0.2.2
GDAL                3.0.1
grpcio              1.17.1
h5py                2.9.0
idna                2.7
Keras               2.2.4
Keras-Applications  1.0.6
Keras-Preprocessing 1.0.5
kiwisolver          1.1.0
Markdown            3.0.1
matplotlib          3.1.1
numpy               1.17.2+mkl
opencv-python       4.0.1
pdf2image           1.9.0
Pillow              5.3.0
pip                 19.2.3
protobuf            3.6.1
pyparsing           2.4.2
PyPDF2              1.26.0
python-dateutil     2.8.0
pytube              9.5.2
pytz                2018.5
PyYAML              3.13
requests            2.19.1
scikit-learn        0.19.1
scipy               1.3.1
setuptools          41.4.0
six                 1.12.0
svgwrite            1.3.1
tensorboard         1.9.0
tensorflow          1.9.0
termcolor           1.1.0
urllib3             1.23
Werkzeug            0.14.1
wheel               0.33.6
xlrd                1.2.0

「おい、おい、おい、」 「丸見えだね」

<追記>インストールした後でもpip3.7 listが動くのでこの操作は不要だった。こういう状況がきちんと想定されていてpippip3.7という二つのエクゼが古いPATH配下に置いてあるという仕組み。ちなみにpython3.7 --versionは動かない。なんでやねん。逐一絶対パスをpython3.7にエイリアスつけるのがノーリスク、かつ頻度と手間に見合ってる。

インストーラを落としてくる

適当に「Python org」と検索して「Downloads」と進むだけ。最新に吸い寄せられる人なら勝手に3.8に誘われます。ここで、「Python」とだけ検索してもオフィシャルなサイトに出ません。日本語のよくわからんサイトばっかり出ます。Python流行り過ぎ。「org」がポイント。

https://www.python.org/downloads/release/python-380/

Python3.8インストーラダウンロードページのスクリーンショット

私の場合は「Windows x86-64 executable installer」をクリックしてpython-3.8.0-amd64.exeをダウンロードしました。

インストーラを起動

さきほどダウンロードしたインストーラを起動します。ここでは特にUAC画面等出ることなく次のような画面が出ます。

Python3.8インストーラ起動時の画面1つめ

「Add Python 3.8 to PATH」にチェックを付けました。これで通常コマンドを打った時に参照されるpythonのバージョンが3.8に上書きされるはずです。pipもしかり。次に「Install Now」をクリックしました。

インストールを実行

最初にUAC(ユーザアカウント制御)の画面が広がります。

Python3.8インストーラ起動時の画面2つめ

Python3.8インストーラ起動時の画面3つめ

こんな感じであっさり完了しました。

自分のPCでは以前にもPythonをインストールしているため、「Disable path length limit」の項目は出現しませんでした。出た場合は押しておくといいでしょう。このプログラムでは既にUAC画面は終わっているのでマークはついていてもクリックすれば一瞬で終了します。

試運転

次のコマンドを叩いてみました。

λ python --version
Python 3.8.0

λ pip list
Package    Version
---------- -------
pip        19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 19.3 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

λ python -m pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/4a/08/6ca123073af4ebc4c5488a5bc8a010ac57aa39ce4d3c8a931ad504de4185/pip-19.3-py2.py3-none-any.whl (1.4MB)
     |████████████████████████████████| 1.4MB 2.2MB/s
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
Successfully installed pip-19.3

しっかりバージョンは3.8に切り替わっています。前に入っていたPython3.7.x系もPC上には残っていますが参照されていません。pipはどうやらデフォルトで最新版ではないようなのでこんな感じでアップデートしてあげましょう。

パッケージの復元

次に保存しておいたpackages.txtを参照しながらパッケージを入れ直していきます。馬鹿みたいにたくさんのパッケージを入れていた人は適宜いい感じのスクリプトを作ってやるとよいのかもしれませんが私程度の量であれば適宜手打ちです。例によって、Windowsではsetup.pyでバイナリをビルドする系のパッケージは対外コケるので「Unofficial Windows Binary」から取ってくる必要があるので手打ち安定でしょう。

Unofficial Windows Binaries for Python Extension Packages

たくさんあるのでnumpyとmatplotlibのみ示します。

λ pip install numpy-1.17.3+mkl-cp38-cp38-win_amd64.whl
Processing c:\users\xxxxxx\documents\python\numpy-1.17.3+mkl-cp38-cp38-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.17.3+mkl

まずnumpyは問題なし。

λ pip install matplotlib-3.1.1-cp38-cp38-win_amd64.whl
Processing c:\users\xxxxxx\documents\python\matplotlib-3.1.1-cp38-cp38-win_amd64.whl
Requirement already satisfied: numpy>=1.11 in c:\users\xxxxxx\appdata\local\programs\python\python38\lib\site-packages (from matplotlib==3.1.1) (1.17.3+mkl)
Collecting kiwisolver>=1.0.1
  Downloading https://files.pythonhosted.org/packages/16/e7/df58eb8868d183223692d2a62529a594f6414964a3ae93548467b146a24d/kiwisolver-1.1.0.tar.gz
Collecting python-dateutil>=2.1
  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1
  Using cached https://files.pythonhosted.org/packages/11/fa/0160cd525c62d7abd076a070ff02b2b94de589f1a9789774f17d7c54058e/pyparsing-2.4.2-py2.py3-none-any.whl
Collecting cycler>=0.10
  Using cached https://files.pythonhosted.org/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
Requirement already satisfied: setuptools in c:\users\xxxxxx\appdata\local\programs\python\python38\lib\site-packages (from kiwisolver>=1.0.1->matplotlib==3.1.1) (41.2.0)
Collecting six>=1.5
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Installing collected packages: kiwisolver, six, python-dateutil, pyparsing, cycler, matplotlib
    Running setup.py install for kiwisolver ... done
Successfully installed cycler-0.10.0 kiwisolver-1.1.0 matplotlib-3.1.1 pyparsing-2.4.2 python-dateutil-2.8.0 six-1.12.0

おや、matplotlibもうまくいきましたね。なにやらダウンロードせずにキャッシュが結構使われています。この辺は前バージョンと共有なのでしょうか。おそらくkiwisolverのsetup.pyが走るところ、コンパイラが入ってないと失敗します。自分のPCはOKだったということでしょうか。失敗した場合は再度「Unofficial Windows Binary」からダウンロードします。この例で、ビルドできるんなら「Unofficial Windows Binary」必要ないんじゃね?ということになり、ガンガンpip install package_nameのみでインストール。ただ、無理なものは結局「Unofficial Windows Binary」から落とす。ビルド出来るやつも結局はビルドしてるんで出来てるやつ落としてきた方がインストールは早い。

その後元通り全てのパッケージを入れ直した。前バージョンとパッケージ共有できるとかいう話は知らん。だったらそういう風にもとからインストールしてくれ。

必要に応じて前バージョンをアンインストール

この状態では参照はされていないPython3.7.x系がパッケージごとPCに残っていることになります。容量なんかが気になる方はそのままアンインストールしてしまえばいいと思いますが、何か動かないとなったときのためにほとぼりが冷めるまで残しておくのも一つの手でしょう。PATHをちょっと変えるだけですぐに動く状態のPythonが使えるので。さすがにこのタイミングで2つ前のPython3.6.x系はアンインストールしました。