M1 Mac Book AirからM3 Mac Book Proに移行してPython環境構築した話

## 概要
5年使用したMacBook Airを手放し、MacBook Proに移行しました。Python環境と諸々のモジュールを整備した時の作業ログです。
非情報系ということもあり環境構築にあまり詳しくなく体当たりで色々試したので、結構蛇足な作業、トライアンドエラーが多いかと思いますが、皆さんが環境構築でつまづいたた時のヒントになると思い、記録を残します。



## Macのスペックなど
#### 旧PC
- 機種：MacBook Air 2018
- 容量：256GB
- メモリ：8GB
- プロセッサ：1.6GHzデュアルコアIntel Core i5
#### 新PC
- 機種：MacBook Pro 2023
- 容量：512GB
- メモリ：16GB
- プロセッサ：Apple Silicon M3

プロセッサが違うためこちらの２機種は、Python環境の互換性が無いようです。そのため、移行アシスタントを使って必要なデータを全て新PCに転送した後、Pythonをアンインストールして環境を再構築しました。

## 公式サイトからのダウンロード
[公式サイト](https://www.python.org/downloads/macos/)からPythonをダウンロードしました。公式サイト経由でダウンロードするとIDLEとPythonラウンチャーも併せてダウンロードできるので、ターミナルよりも便利な編集・実行環境がゲットできます。

## HomeBrewのインストール
旧PCでPythonの環境構築をしたときもHomebrewを使ったので、今回も同様に使っていきます。ターミナルでこちらのコマンドを実行しました。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## pyenvのインストール
Pythonのバージョン管理に使うpyenvをインストールしました。（初知り）
brewを使ってインストールしました。
```
brew install pyenv
```
Pythonのシステムの向き先がPythonのままなので、以下のコマンドでPATHを通します。
```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

## 所望のPythonのインストール
欲しいバージョンのPythonをpyenvでインストールします。
pyenv経由でpythonをインストールする場合、xzを先にインストールしておきます。
```
brew install xz
```
次のコードで最新のpythonのバージョンを確認して
```
pyenv install --list
```
出力された型番から欲しいバージョンのpythonをダウンロードします
```
pyenv install 3.x.x
```
pythonのバージョンをインストールしたものにするにはglobalを用います。
```
pyenv global 3.x.x
```
どのバージョンのpythonがインストールできたかは以下のコマンドで確認できます。
```
python -V
```


## poetryのインストール
あまり環境依存するような複雑なコードを書いたことがないので今後使うかどうかわからないのですが、パッケージ管理用のツールであるpoetryを導入しておきました。PATHを通すコマンドを打ち込みます。
```
curl -sSL https://install.python-poetry.org | python3 -
```
## .bash_profileの編集

https://note.com/t_ak66/n/nc251eaef6523#aaa4366e-bbac-4084-93b9-34757a289a05

.bash_profileに記述してある、旧PCの設定を書き換えます。
まずviコマンドで.bash_profileの中に入ります。
```
vim ~/.bash_profile
```
前のパスが書かれているので、以下の通り修正。
```
# bashrc有効化
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

eval "$(/opt/homebrew/bin/brew shellenv)"

# pyenv
export PYENV_ROOT="$HOME/.pyenv"
##export PATH="$PYENV_ROOT/bin:$PATH"　　　　（このパスから下のパスへ変わったようです）
export PATH="$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

export LDFLAGS="-L/opt/homebrew/opt/zlib/lib"
export CPPFLAGS="-I/opt/homebrew/opt/zlib/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/zlib/lib/pkgconfig"

## ↓Intel Mac時代に設定したこの環境変数が悪さをしていたと思われます。
## postgresql
##export ARCHFLAGS="-arch x86_64"
###export PGDATA="/usr/local/var/postgres"
```
viの編集についてはこちらの記事が参考になります。

https://qiita.com/savaniased/items/d9d37d3b958c1f54237e



## 必要なモジュールのインストール
これでひとまずPython自体は動くようになったのですが、numpyなどのモジュールをコードでimportしようとすると次のようなエラーを吐きました。

```python
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "【ファイルのディレクトリ】", 1
ine 1, in ‹module>
import mayavi.mlab as mlab
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-p
ackages/mayavi/mlab-py", line 15, in ‹module>
from mayavi.core.common import process_ui_events
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-p
ackages/mayavi/core/common.py", line 16, in <module>
from apptools-persistence.state_pickler import create_instance
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-p ackages/apptools/persistence/state_pickler.py", line 116, in ‹module >
import numpy
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-p
ackages/numpy/__init_
_py", line 135, in ‹module >
raise ImportError(msg) from e
ImportError: Error importing numpy: you should not try to import numpy from
its source directory; please exit the numpy source tree, and relaunch your python interpreter from
```
移行したときに、前のCPU用の実行ファイルが色々混ざったことが原因として考えられるようです。今の環境下でモジュールをimportできるよう、以下のコマンドで強制的にpip installを実行しました。

```
pip install --upgrade --force-reinstall <package>
```
## No module namedとなっているモジュールのパスを通す
コードを実行しようとした時、次のようなエラーが出力されました。
```
No module named mayavi
```
PythonのPATHに何かしらの問題があり、モジュール(今回の例だとmayavi)を認識してくれなかったようです。
そこでまずpipでモジュール情報を確認します。
```
pip show <module>
```
するとモジュールの情報が出力されます。Locationの行にディレクトリパスが出力されると思うので、そちらを使います。
上記の時点で、モジュールが存在していなければpipでインストールします。

```
pip install <module>
```
次のコードをコードに追記することでパスを設定でき、モジュールを動かすことができました。

```python
import sys

# passの設定 (pip showで出てきた、LocationのPASSを以下に設定)
sys.path.append('/opt/anaconda3/envs/xxxxxxxx/lib/pythonX.X/site-packages')

# passの設定はimportするモジュールより前に設定
import xxxxxx
```



## VSCodeにて必要なモジュールの再インストール
VSCodeのjupyter notebookを使ってコーディングすることが多いので、必要なモジュールを再インストールしました。
```
pip install numpy
```
など基本的にはpipでインストールできました

## 振り返って
旧PCにPythonの環境を我流で構築をした時代は、プログラミングなんて全然分からないひよっこ状態だったので、インストールの手法や環境がかなりごちゃごちゃでした。問題が起きている箇所に自覚がないまま、エラーに悪戦苦闘。友人を頼りながら5時間ほどかけてPythonの環境構築が完了しました。（研究でPythonを使っているので、動かなかった時は終始冷や汗をかいていましたね）
ひとまず動く状態にはなりましたが、エラーに対しては場当たり的な対処で根本的な解決には至りませんでした。よってこのカオス環境は旧PCから引き継がれることとなりました。旧PCのリセット・下取りの準備は完了したのですが、新PCでPythonの不具合が見つからないことを祈ります。。。

![D3473E9A-15D7-4376-B10F-7B8B0C32B6C0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574056/64573979-cf11-e35a-f3bd-bc4d49d00859.jpeg)


## 参考URL
- [ゼロからM2 MacにPython環境構築](https://zenn.dev/grahamian/articles/cfcd4039194117)
- [M1 Mac に Python をインストールしたい](https://zenn.dev/taichifukumoto/scraps/1f2ae08258f959)
- [Mac OSでPython環境を構築する作業メモ](https://zenn.dev/colum2131/scraps/7e573ae7ad3baa)
    - 私が使っている新PCがまさにM3チップだったので参考になりました！
- [【IT】M1 MacBookでのpyenvの再導入](https://note.com/t_ak66/n/nc251eaef6523#aaa4366e-bbac-4084-93b9-34757a289a05)
- [bashの編集](https://qiita.com/savaniased/items/d9d37d3b958c1f54237e)
- [Vim / Vi を終了させる方法](https://qiita.com/kon_yu/items/b8864ff566b8b67a9810)
- [How to replace Python x86 packages with arm64 ones?](https://stackoverflow.com/questions/76491236/how-to-replace-python-x86-packages-with-arm64-ones)
- [pythonでimport時に、ModuleNotFoundError: No module namedが出た時の対処手順](https://qiita.com/ymto/items/e00e95543aab2d4d45ee)
- [MacでPythonをインストールする方法](https://qiita.com/omo_taku/items/bc97f69391b2f4627f36)
- [Python3インストール（Mac編）](https://qiita.com/ms-rock/items/72b8f1abc661c539bb09)


### 備忘録・トライしたけどできなかったこと
#### pipでrequirements.txtを使ってパッケージを一括インストール

https://www.cfxlog.com/python-requirements-txt/

インストールしたいパッケージを記述したテキストファイルを作って、pythonにて一括ダウンロードできればかなり手間が省けたのですが、
```
$ pip freeze > requirements.txt
```
がうまく動かず断念しました。一つ一つ地道にインストールしましたorz