Pythonの学習を始めて約1年の33歳のクソジジイです。今回Pythonの個人的な学習の過程で、インタープリター(interpreter、いわゆるPythonのバージョン)のグレード「ダウン」を迫られる場面があり、少し時間を溶かしたので、そのときに一応思ったとおり動くようになるまでにとった対応を備忘録として記録しました。
※もし、「この手順は不要」とか「もっと楽、もしくは安全な方法があるよ」という部分があれば、どしどし編集リクエストいただけるとありがたいです。
〇 今回生じた問題
学習を進めようとしたPythonの外部ライブラリー(=外部モジュール)の1つであるOpenpyxlを venv による仮想環境下で動かそうとしたところ、pipでインストールしてあり、venv も有効化されていて、pip listなどで調べてもopenpyxlがimportされていることは確認できるのに
import openpyxl
wb = openpyxl.load_workbook("excel_sample\\基本.xlsx") #エクセル基本.xlsxを読み込む
print(wb.sheetnames) #基本.xlsxのシート名を出力
wb.close() #2行目で読み込んだ基本.xlsxの情報を消す
という簡単なスクリプトを試しにターミナルで動かして、基本.xlsxというエクセルファイルの全てのシート名をターミナル上に出力しようとすると「ModuleNotFoundError: No module named 'openpyxl'(「openpyxl」という名前のモジュールがありません)」と言われてしまった。なお、いずれの操作も VScodeを利用
※Pythonに関する技術書を購入すると、「Anaconda という開発環境をとりあえずインストールしましょう」という内容が書かれていることが多いのですが、後述する理由によりあえて使っていません。
〇 一応思ったとおり動くようになるまでにしたことの主な流れ
※いずれも上記のスクリプトを記述した.pyファイルを含むフォルダをVScodeで開いた状態で行いました。(そのフォルダがカレントディレクトリになるようにする)(より詳しい詳細は「〇そもそもインタープリターとは」、「〇Pythonのバージョンをグレードダウンしたときの実際の手順」に載せました)
次の通り
(1) openpyxlの公式ドキュメント (https://openpyxl.readthedocs.io/en/stable/) に従い、Pythonのインタープリター(=バージョン)をopenpyxlを動かせる少し古いものに敢えて変更
※openpyxlは3.6.x~3.9.xであれば動かせるようでした。(変更前は3.11.4を使用していました。)
(2)一旦 venv を削除し、PC再起動
(3)再度 venv を以下のコマンドで作成し直して有効化
コマンドプロンプト(cmd)の場合
#venvの作成、2つ目の「venv」はその名前(任意の名前にしてよい)
python -m venv venv
#venvの有効化、2つ目の名前をvenv以外した場合、最初の「venv」をそれに変更
.\venv\Scripts\activate
powershellの場合
#実行ポリシーを変更
PowerShell Set-ExecutionPolicy RemoteSigned CurrentUser
#venvの作成、2つ目の「venv」はその名前(任意の名前にしてよい)
py -m venv venv
#venvの有効化、2つ目の名前をvenv以外した場合、最初の「venv」をそれに変更
.\venv\Scripts\activate
(4)pipコマンド自体のアップグレード
python -m pip install --upgrade pip
(5)フォルダ内に
pip freeze > requirements.txt
で作成しておいた requirements.txtを利用して、
pip install -r requirements.txt
で②のvenv削除とともに削除された外部ライブラリーとのpipコマンドによる紐づけを一括して復元
とりあえず今回の件でPythonの開発においては
(A)使用している(=インストールしている)Pythonのバージョン
(B)importする外部ライブラリーを用いたコードを解釈・実行できるPythonのバージョン
に対し、(A)が(B)の範囲に収まるようにすることの必要性、そして、必ずしも(A)は最新版にすればいいわけではないことを学びました。(´。`).○〇(外部ライブラリーの公式ドキュメントの様式マジで誰か統一してくれないかな・・どのバージョンはOUTか探すのそこそこ面倒)
〇そもそもインタープリターとは
そもそもインタープリターとは
interpreter(インタープリター):もとの意味は「話し言葉をリアルタイムで訳す通訳者」ですが、Pythonにおいては以下の公式等からダウンロードしたときのバージョンを指します
※一般にソースコード(人間に読める)を2進数による機械語(PCのみが意味を理解できる)に直し1行ずつ逐次解釈して実行しているプログラムを指します。詳しくは、主な参考資料①
Pythonの公式サイト ( https://www.python.org/ ) から無事インストールされていればpowershellやコマンドプロンプト等のターミナルを開いて、
python --version
と打つと、「python ~.~.~(~、~、~は数字)」みたいな感じでバージョンが表示されます。 そして、この数字は「どのPythonのバージョンをインストールしたか」によって異なります。上のPythonの公式を開くと
というような画面が出てきて、Downloadsの対応するOSを選択すると、以下のような画面が出てきます。
なお、上のスクリーンショットは2024.08.15時点でのものです。Latest、つまり最新のバージョンは 3.12.5 ということになります。私もつい最近まで入れた最初に入れたときのバージョン 3.11.4を使っていました。
これまでプログラミングやITを学習する過程で、「何らかの言語・フレームワークやサービスの公式のバージョンが更新されるとそれに対応してデプロイ(=リリース)してあるものをその仕様に合わせないといけない」みたいなイメージがあったのですが、どうやら
「Pythonも最新または新しいバージョンを入れておけばいい」というわけでは「ない」ようです
なぜかというと、pipなどを通して使う外部モジュールは対応している(=サポートが効いている)Pythonのバージョンが外部モジュールごとに微妙に違うからです。
これは外部モジュールを作っている各つよつよエンジニアがそれぞれに自分が作った外部ライブラリーを日夜更新していることによります。(そして、Pythonそのもののバージョン更新に外部ライブラリーのバージョン更新が追い付けない。)
※例えば、Python用のソフトウェアのリポジトリであるPyPI ( https://pypi.org/ )から適当にライブラリーを検索して公式 Documentを眺めると、たぶん強々エンジニアであろう人の名前がそれぞれ載っています。
〇Pythonのバージョンをグレードダウンしたときの実際の手順
※注:これまでずっと学習用私用PCはWindowsで、Macユーザーの方は適宜各自Macなら何に対応するかそれぞれ確認してください。
次の手順をとりました
(1)openpyxlの公式ドキュメント (https://openpyxl.readthedocs.io/en/stable/) を見て対応しているPythonのインタープリタを確認
次のような画面が出てきます
※Introductionには、openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.(openpyxl は Excel 2010 の xlsx/xlsm/xltx/xltm 形式ファイルの読みとり・書き込みのための Python のライブラリーです)とありますが、Office 365でも動きました。
そしてスクロールすると、以下のようにありました。
Other ways to help の一番最後 「proposing compatibility fixes for different versions of Python: we support 3.6, 3.7, 3.8 and 3.9.(異なるバージョンのPythonの互換性修正を提案しています: 3.6、3.7、3.8、3.9をサポートしています。)」
実際、参考にして学習を進めている技術書(主な参考資料②)の Python のバージョンも3.9.6になっていました
(2)変更前時点で Python のコードを解釈し実行しているインタープリタを確認
VScodeを使っている場合、以下の部分でも確認できます。
※現時点では変更後のスクショをとったため、数字が3.9.6になっています。なお、複数のインタープリターをPCにインストールさせている場合、ここを押すと画像真ん中上のようにインタープリターの選択というのが出てきて切り替えることができます。
(3)公式サイト( https://www.python.org/ )から、3.9.6のバージョンのインストーラーをダウンロードし、(Windowsユーザーのため)PC ⇒ ダウンロード内に入ったインストーラーに従い、3.9.6 のインタープリターを入れる
※〇そもそもインタープリターとは に記載した通りに進むとWindowsの場合、ここにインストーラーがダウンロードされます。
(4)3.9.6以外のインタープリター・Anaconda等インタープリターを含んでいるものをアンインストール後、一旦PC再起動
アンインストール時の手順
デスクトップのWindowsマークの歯車で次の画面に遷移
※赤矢印のところでpython、Anacondaなどと検索できます。Macの場合、Finder等で同様に辿れるのではないかと思われます。
※アンインストール後、再起動をかけるまでなぜかVScodeによるインタープリターは変更前のものになっていました。
(5)上の(2)に記載した方法(主な参考資料③で初認識)を用いてVScode上でインストーラーを切り替え・切り替わっていることを確認
(6)VScodeでvenvを削除&venvを削除した時点で一緒に抹消されたopenpyxl等の紐付けを復元
そのときのVScodeターミナル画面
注1 最初にエラーが起きた時点でのvenvだと前のインタープリターの情報が残っている??ようでインタープリターをただ変えるだけでは上手く動作しませんでした。
注2 venvを削除・インタープリターを切り替えた時点でpipのコマンドもそれに伴ってグレードダウンされるようですが、pipコマンドは最新版にアップグレードしました。
(7)動作確認
〇注意:グレードダウン時に起こりうること
3.11.4で別に作っていたプログラムが一瞬動かなくなりました
グレードダウン後、別に学習を進める過程で作成中のFlaskアプリの開発用サーバーを試しに動かそうとしたところ、そのFlaskアプリはインタープリター3.11.4で作っていたため??同様にImportErrorが置きましたが、同様に、3.9.6の段階で
(1)venvを削除&再作成
(2)pipを再度最新にアップグレード
(3)requirements.txtで必要な外部ライブラリーとの紐付けを一括復元
すれば無事動くようになりました。
なお、上記のようにして動いた段階で 各venvにバージョンが何らかの形で紐付いている?? と思ったのですが、なぜか再度3.11.4をインストールして切り替えて動かすと不具合は起こりませんでした。(※このとき、venvの削除などはしていない)また、なぜか最新のバージョンでも同様にいけました。何でや・・(´д`)まあ、動くんなら何でもいいんやけど
〇3.11.4に再度切り替えて画面
〇3.12.5に切り替えて動かした画面
※ソースコードのオレンジ色のメッセージはVScodeの拡張機能Error Lensによる「(非推奨などを示す)アラート」です
主な参考資料
①インタープリタ言語とコンパイラ言語 @tomokichi_ruby さんQiita
https://qiita.com/tomokichi_ruby/items/73b0e7924a9f83fe45c6
②『最初からそう教えてくれればいいのに!Python で Excelやメール操作を自動化するツボとコツがゼッタイにわかる本』 秀和システム 立山秀利 著
③【Python・VSCode】Pythonのバージョン切り替え方法
https://www.codevace.com/vscode-py-ver-change/
④PythonでImportErrorが起きたときの確認事項まとめ @ktgwaaa さんQiita
https://qiita.com/ktgwaaa/items/6d1f54d5ff3c4559f96c
⑤『Pythonエンジニア育成推進協会 Python実線レシピ』 技術評論社 鈴木たかのり、筒井隆次、寺田 学、杉田雅子、門脇 諭、福田隼也 共著
⑥『確かな力が身につくPython「超」入門』 SB Creative社 鎌田正浩 著
Pythonに関する用語に関するメモ
モジュール
詳細
Pythonプロジェクトにおける、ある程度のまとまりをもったファイルのこと(拡張子は.py)さらにそれらをある程度機能群でまとめたものをパッケージ(package)やライブラリーなどと呼びます。
ライブラリーには、いずれかのPythonをインストールした時点でimportすれば使える標準モジュール ( https://docs.python.org/ja/3/library/index.html )と、pipやpoetry(Pythonのパッケージ管理システムの1つ)を通して各開発環境に紐付けてからimportする外部ライブラリーがあります。外部ライブラリーにそもそもどのようなものがあるのか調べるのに例えば、先述のPyPI以外だと、Python学習当初は見やすかったです。
【図解】Pythonのライブラリ 24選+α @python_academia(Python アカデミア) さんQiita
https://qiita.com/python_academia/items/62aefbf4e373cd2aa496
※なお、この人のyoutubeや技術記事ブログは個人的にはかなり充実しているように思います。
venv
詳細
pythonコマンドやpipコマンドを使ったPythonパッケージ(=外部ライブラリー)のインストール先など、Pythonの実行環境を独立した領域に分離するための仕組み。なお先述の外部ライブラリーにもバージョンがあり、PCに直接バージョンの異なる2つ以上の同じ外部ライブラリーを入れて動かそうとすると、何かしら相互干渉を起こして問題が起こることがあります。(Pythonのフレームワーク(Django、Flaskなど)もPythonの外部ライブラリーであるため同様です)
※今回の本題はPythonと外部ライブラリー間のバージョンの話でしたが、同一プロジェクト内で異なる外部ライブラリーを使う場合も相互干渉が起こりうります(※そして大概複数併用してプロジェクトを作成)
※基本、各プロジェクトごとにフォルダを分け、そのフォルダ直下に以下のコマンドでそれぞれ作成
venv使用時のコマンドチートシートとしてメモったQiita
https://qiita.com/thinking-weed/items/61dd687cdb49f0466f40
※筆者はまだ学習できていないが、これを発展させたパッケージ管理システムにpoetryなどがある
Anaconda
詳細
Pythonのインタープリターやいくつかの外部ライブラリーをすでに含んでいるディストリビューション(要するに、Pythonプログラムを動かすのに必要な物をある程度セットにしているもの)
〇公式リンク( https://www.anaconda.com/download )
〇参考になると感じたサイト(株式会社アスク、法人向けコラム Anacondaとは?メリットや使い方、おすすめツールを解説!)
https://www.ask-corp.jp/biz/column/anaconda.html
※Python に関する技術書を買うと、しばしばVScodeではなくAnacondaや、Anaconda内にも入っているデータサイエンス系のIDE(?)Jupyter notebookなどを薦めている本がしばしば散見されますが、それを無視してvenv&VScodeで済ませている理由は以下の通りです。(あくまで私見です)
・(上のサイトにもありましたが、)Anacondaはかなりいろんな物を含んでおり、異なる外部ライブラリーが相互干渉して何かしら不具合を起こすことがあるらしく、追加してpipやcondaコマンド等でカスタマイズするのにあまり適していないのでは??と感じた。
・Jupyter notebookより、VScodeを通して作業を進める方がGithubによるソース管理が楽そう
requirements.txt
詳細
各venvごとにpip等でインストールした外部ライブラリーを記録・復元するためのテキストファイル。なお、requirements.txtのrequirementsというのは慣例的な名前らしい。
〇カレントディレクトリ内に作成・既存の物を外部ライブラリーインストール毎に更新
pip freeze > requirements.txt
〇 requirements.txt を参照して(書かれた)ライブラリー(・パッケージ)を一括インストール(あるプロジェクトのものを他のプロジェクトでコピペして流用可能)
pip install -r requirements.txt
一応こんな感じ(数字は各外部ライブラリーのバージョン)
※各外部ライブラリーのバージョンを更新して上のコマンドを打つと、数字も更新される