enchanのメモ書き

計算機とフリルとラブライブ!

メイン機のPythonをアップデートした

私のメイン機, MacBook Pro 2020 (Intel) のPython環境をアップデートしたので日記がてらメモ。

お久しぶりです。…えっいやマジで久しぶりだな

ツワッピ(Twitter API)の仕様が一昔前のOracle JDK騒動を彷彿とさせる流れになったり代替SNS周りで色々起きたりと 2023年も初手から飛ばし過ぎな感じもしますが、なんとかインターネット上の居場所を確保していきたいなあと思うなどしています。 今年もEaaC(Enchan as a Contents)を何卒よろしくお願いします。

Pythonのバージョン

ところで(無理のある話題転換)、皆さんが普段使っているPythonのバージョンはいくつでしょうか?

3.9.x? 3.10.x? もしかしたら 3.11.x をメインで使う猛者もいらっしゃるかもしれません。 環境が古かったり諸々の理由で 2.7.x を使っている方もいらっしゃるでしょう。それぞれ状況は千差万別です。

弊メイン環境はもう長いことmacOSなので、homebrew経由でインストールした 3.9.x を使っていました。

しかし。

brew更新したらPython更新されちゃった

少し前に何も考えず brew upgrade した結果、Pythonが 3.10.x にアップグレードされてしまいました

これではライブラリも使えません。実に困ります。

% python3.9
Python 3.9.15 (main, Oct 11 2022, 22:27:25) 
[Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy

% python
Python 3.10.8 (main, Oct 13 2022, 10:17:43) [Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
>>>

仕方がないのでシェルのエイリアスに python -> python3.9 を追加することで応急措置としていましたが、 この対応はそろそろまずいだろうということで 思い切ってPython側に従うことにしました。

とりあえず更新の確認

私といえばソースインストールみたいなところがありますが(事例, 事例)、今回は普通にhomebrewに従いたいと思います(面倒なので…)。

Pythonをアップグレードしてしまったのも結構前の出来事なので、一旦バージョンを確認します。

% brew info python
==> python@3.10: stable 3.10.9 (bottled)
Interpreted, interactive, object-oriented programming language
...
% python3.10 --version
Python 3.10.8

現在の最新版は 3.10.9, 手元のバージョンは 3.10.8 であるようです。もはや誤差のようなものですが一応更新します。

% brew upgrade python

こまめに brew update しておかないとここでやたら時間を食います。記事を書きながらコマンドを打っているので現在とても暇です。

ライブラリの確認

次に、これまでインストールしていた環境のライブラリ一覧を整理します。

% pip3.9 list
Package                           Version
--------------------------------- -----------
aenum                             3.1.0
aiounittest                       1.4.0
alabaster                         0.7.12
anyio                             3.6.1
...

3桁!…とまではいきませんが、結構な量が入っていました。

移行

あまり余計なことを考えたくないので、pip freeze の出力をいい感じにうにゃうにゃして移行していきます。

# バージョン表記を削除 (対応するPythonのバージョンが変わっている可能性がある)
% pip3.9 freeze | sed -r 's/==.*$//' > installed_libraries_at_3_9.txt

プライベートリポジトリから落としてきたライブラリなどなど色々と枝払いを行い、適当にこんな感じのシェルを書きました:

#!/bin/zsh
#
# pythonのライブラリ群を移行する
#

FILE_NAME="installed_libraries_at_3_9.txt"
LIBS=( `cat $FILE_NAME` )
for libname in ${LIBS[@]}; do
    echo "name: ${libname}"
    pip3.10 install -q $libname
    sleep 10 # あまりpipサーバに負荷をかけてもいけないので…
done

あとは実行して見守るだけです。 ちなみに失敗しても続きます:

name: *****
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: '***'
Consider using the `--user` option or check the permissions.

このあたりは終了コード読んだり色々すれば回避できそうです(が、書き捨ての移行スクリプトにそこまで肩張っても仕方ないので妥協)。

サーバ負荷対策として sleep を挟んでいますが、クライアントに入っているライブラリが多いとかそういう場合はちょっと考えた方がいいと思います(アクセス量がやばい)。

完了!

% python3.10
Python 3.10.10 (main, Feb  8 2023, 05:44:38) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> 

無事に新しい環境に移行できました。よかったよかった。

比較するとこんな感じです:

結構バージョンアップされていることがよくわかります。やはり定期的なバージョンチェックは大事ですね。

ということで、今日の偉業でした。おやすみにゃさい。
移行先が丸わかりな結びですね。

fflush(stdout)