WindowsでのオススメのPython環境
2023-05-21(日)
普通にPython.orgからダウンロードして入れましょうという話。
これまでオススメのPython環境はAnacondaだったもののNavigatorでトラブルが発生するとかなり面倒だったり,condaがいつまでたっても依存関係を解決してくれなかったりとイマイチな状況が増えてきたのと,結局のところpip使わないで済むことは無いのでcondaではなくpipで統一してしまった方が楽だというのが動機でpy.exe
の存在が決定的。macOSでもAnacondaではなく標準+pyenv+venvになってる。
1. Pythonのインストール
公式の配布サイトから3.11.xをダウンロードして実行。
インストーラの画面は特に弄らずそのままInstall Nowを選ぶ。
"Setup was successful"と出たらインストール完了。
そのウィンドウにDisable path length limitという表示があったらそれを選択する。Windowsに限らず環境変数PATHという概念があり,そこに羅列したフォルダ内のプログラムはどこからでも呼び出せる,というOSの仕組みがある。macOSやUnixは問題ないのだが,WindowsはC:\Program Files
またはC:\Program Files(x86)
みたいなアホ長いフォルダが標準的なインストール先なのでPATHに羅列しようとすると凄まじい長さになるのが明白にもかかわらず,環境変数に設定できるのが260文字までというアホな制限がある。それを回避する方法がこの選択肢。
Windowsメニューの「すべてのアプリ」にPythonフォルダが出来ている。
黒っぽいアイコンのPython 3.xx(64-bit)
を選ぶとコマンドプロンプトの黒い画面が開き
>>
のような入力待ち(プロンプトと呼ぶ)になるのでquit()
と打って一旦終了させる。
2. パッケージのインストール
Windowsメニューの検索にcmdと打ってコマンドプロンプトを起動する。
pipのアップグレード
Pythonのインストール時にpy.exeというプログラムもインストールされていて,自動的に「今使うPython」を呼び出す仕組みになっている。Pythonはパッケージ(機能)を呼び出すときに
python -m パッケージ名 パッケージのオプション
とするか,パッケージによっては
パッケージ名 パッケージのオプション
のような感じで起動するのだが,後者はWindowsだと手間のかかるPathの設定が必要なので,py.exeと前者を組み合わせて使う。例えばよく
pip install -U pip
と実行しろと説明しているサイトが多いが,「パッケージ管理のpipを使ってpip自身をアップグレード(-U)しろ」というコマンドは
py -m pip install -U pip
と書く(.exeは付けなくて良い)。ということでまずは↑のコマンドをコマンドプロンプトで実行してpipをアップグレードする
無難なパッケージのインストール
何をやるにしろあった方が便利なものを一通り入れておく。コマンドプロンプトに以下をコピペする。(^は長いコマンドに途中改行させる方法)
py -m pip install jupyter notebook ipython opencv-python ^
opencv-contrib-python numpy scipy scikit-image scikit-learn ^
pillow pandas matplotlib seaborn mediapy pyqt5 ^
qtconsole jupyterlab
ScriptsフォルダにPathを通さないと使えないぞ、という警告が出るが無視してよい。
- ipython: 普通のpythonより親切なPythonインタプリタIPython
- jupyter: NotebookとLabで使うエンジン
- jupyterlab: Jupyter Lab。MATLABっぽいNotebook+コマンド+インタプリタな何でもあり版な開発環境
- matplotlib: グラフや画像の表示に使う可視化
- mediapy: Notebookで画像や動画を楽に表示できる
- notebook: Jupyter Notebookというブラウザベースで動くPythonの開発環境(ノートを取りながらPythonを実行できるので人気)
- numpy: 行列演算ライブラリ
- opencv-python: コンピュータビジョンライブラリOpenCV
- opencv-contrib-python: OpenCVの正式版には含まれていない機能の追加
- scipy: 科学技術系ライブラリ
- scikit-image: SciPy toolkit=scikitでscipyのサブモジュールの一つで画像処理関係
- scikit-learn: scipyのサブモジュールの一つで機械学習関係
- pandas: データ解析でR言語っぽい動きをする
- pillow: PIL(Python Imaging Library)という古くからある画像処理ライブラリから派生した現代版で呼び出しはPILとして互換性が保てる
- pyqt5: Qt(キュート(Cute)と読む)のPython版でなぜかパイキューティーと読まれる。GUIアプリのベースとなるものでqtconsoleで使う
- qtconsole: コマンドプロンプトでもIPythonは使えるが,こっちだと画像が表示できる。
- seaborn: 可視化でmatplotlibよりダサくない
が入れるもの。
3. IPythonを使ってみる
IPython(アイパイソン)のように大文字小文字に注意。最初の文字はアイの大文字。IPythonは通常ipythonコマンドで起動するよう書かれているドキュメントが多いが,
py -m IPython
のようにPythonのモジュールとしてインストールされるものはScripts内のコマンドを使わなくてもpyに-mを付けてモジュール名を指定すれば使える(quitで終了)
QtConsole
qtconsoleの方が応用が効くので
py -m qtconsole
とすると、QtのUIを使ったIPythonが使える。ただし、mediapyのshow_*はインライン表示に使えないのでmatplotlibのimshowを使う必要がある。
from urllib.request import urlretrieve
urlretrieve('https://www.python.org/static/img/python-logo@2x.png',
'python-logo.png')
で入手したファイルをインライン表示したいが、
import mediapy as media
media.show_image(media.read_image('python-logo.png'))
だと表示できない。
import matplotlib.pyplot as plt
import mediapy as media
plt.imshow(media.read_image('python-logo.png'))
だと表示できる。
import PIL
PIL.Image.open('python-logo.png')
も表示できる。
ipyエンジン専用の画像表示
from IPython.display import display, Image
display(Image('python-logo.png'))
だとIPythonかJupyter Notebook専用になるが表示できる。
from IPython.display import display
import mediapy as media
display(media.read_image('python-logo.png'))
だとndarrayと見做されて生データがドバーっと出る。
quitでウィンドウが閉じる。
4. Jupyter Notebookを使ってみる
コマンドプロンプトでJupyter Notebookのサーバーを起動する命令なのだがデフォルトでそのページを開くようOSに命令を出すのでブラウザが起動する。
- コマンドプロンプトを起動
- Jupyter Notebookのサーバーを起動
- 色々作業
- Notebookで「閉じて終了」を選ぶ
- コマンドプロンプトでCtrl+Cを2回入力してサーバーを停止
という流れになる。当たり前だがブラウザが開いた後にコマンドプロンプトを閉じると使えなくなるので注意。
py -m jupyter notebook
でブラウザが起動しJupyter Notebookが使える。
New
ボタンを押すとPython3
が出るので選択するとNotebookが新規作成される。
Notebookはセルという単位で分割されていて,セルにはコードセルとMarkdownセルがある(MarkdownはWikipediaとかを参照)。
Markdownで説明を書き,その下にコードセルでPythonプログラムを書くような流れで「実験ノート」が作れる。Markdownの表示やコードの実行はCtrl+EnterまたはShift+Enter。
from urllib.request import urlretrieve
urlretrieve('https://www.python.org/static/img/python-logo@2x.png', 'python-logo.png')
import mediapy as media
media.show_image(media.read_image('python-logo.png'))
保存した後で,ブラウザのJupyter NotebookでSave
で保存してからClose and Halt
でタブを閉じる(ブラウザのタブを閉じてもPythonのプロセスは停止してくれない。ファイル一覧で緑色のアイコンがそれを意味する)。
その後コマンドプロンプトで「Ctrl+C」を打ってJupyter Notebookのサーバーを終了させる。
ちなみに保存されるのは.ipynb
(IPython Notebookと名乗っていた時代の名残り)という拡張子のファイルで,Visual Studio CodeやGoogle Colaboratoryでも開ける。
New
ボタンではText File
を選ぶとテキストエディタとなり,テキストエディタのFile-Rename
で.py付きのファイル名(例えばHello.py)にするとPython用のハイライト表示エディタになる。また,New
からTerminal
を選ぶとコマンドプロンプトの親戚のようなPower Shellが開くので,.pyファイルを編集して
py なんとか.py
みたいにPythonスクリプトを実行できる。
5. Jupyter Labを使ってみる
Notebookと同じノリで起動する。Notebookだとエディタもターミナルもブラウザの別タブになって鬱陶しいが,Jupyter Labは一つのウィンドウに収まる。
サーバーとして起動するのはNotebookと同様で,
py -m jupyter lab
でブラウザが開き、JupyterLabが表示される。JupyterLabはJupyter Notebookの豪華版という感じで、
- Notebookでのプログラミング
- IPythonでのコマンド実行
- .pyファイルを使ったプログラミング
- ターミナルでの作業(WindowsだとPowershellがデフォルト)
が可能。
とりあえずの開発環境としてはこれが無難。
6. その他
(あくまでもWindowsのマシンで)PythonをLinuxで動かす
WindowsでPython(特に外部パッケージ)を扱うのは今はだいぶ良くなったとはいえ「動いたらラッキー。動かなかったらがんばりましょう」という認識でいた方が良い。できればUbuntu等のLinux系を使う方がトラブルが少ないので,もう少し凝った使い方としては以下がある。
特に深層学習フレームワークを使う場合にはLinux系OSで扱う場合が殆どなので今のうちから慣れておくと良い。
- WSL2
- Windows Subsystem for Linuxの略称で,Microsoftが提供していて,Winodws上でまんまLinuxが動くので,Ubuntu等のPython利用の解説がまんま使える
- NVIDIAがCUDA Driverも出してるのでNVIDIAのGPUを積んだマシンならWSL2上でTensorflowとかPyTorchが使える
- WSL2+Docker
- 様々な環境を搭載したコンテナを拾ってきて直ぐに試せるうえにVMと違ってディスク容量をそこまで圧迫しない
- WSL2+Docker+VSCode
- Visual Studio CodeはMicrosoft製のテキストエディタだが,拡張機能でコンテナ上の開発環境を使ってプログラミング,とかが楽にできる。
- VSCodeに慣れると,リモートホスト上のDockerコンテナ上で開発。のようなことも出来る。
他のバージョンのPython
LinuxやmacOSの場合はpyenvという便利な解決法があるのだが,Windowsの場合案外面倒そうなので素直に特定のマイナーバージョンのインストーラをPython.orgから持ってくるのが楽。その上で,
set PY_PYTHON=バージョン
を指定すると,そのコマンドプロンプト上では以後py.exeが勝手にそっちのバージョンを使ってくれる。例えば,3.11と3.10を入れている場合
set PY_PYTHON=3.10
と打てば以降3.10.xが使え,
set PY_PYTHON=3.11
とすれば3.11.xが使える。
仮想環境
ある特定のバージョンのopencv-pythonが必要(例えばOpenEXRがギリギリ使える4.5.4とか)だが,普段は最新のopencv-pythonを使いたい。とか,requirements.txtで指定されている環境を作りたい。とか,Pythonでのパッケージのバージョン環境は簡単に崩壊する。特に深層学習フレームワークについては後方互換性をバッサリ切っているものが多いので,色々試したい場合には環境を変えて作業した方が安全。
安全な解決方法は
- 作業ごとにPCを用意する
- 作業ごとにDockerでコンテナを作る
とかなのだが,Pythonの環境だけ切り替えて使える機能が仮想環境である。condaとかvirtualenvとかがよく使われてきたが,最近は公式のvenvを使うのがトレンドらしい。
自分が作業をするフォルダで
py -m venv 仮想環境名
と打つと,「仮想環境名」のフォルダが出来る。そこのScriptsフォルダにactivate.bat
があるのでそれを実行する(PowerShellの場合はActivate.ps1)。例えばvenvHelloみたいな名前にすると,
py -m venv venvHello
venvHello\Scripts\activate.bat
と打つと,プロンプトの頭に(venvHello)のように仮想環境名が表示されるので,あとはpipなりで環境構築すれば良い。