【Python】Homebrew+Pyenvの環境構築が最強な話（＋コマンドラインの備忘録）

## はじめに
　この記事はmacユーザー向けです。それ以外の方でも読めるようにしているつもりですが、トラブルシューティングは自力でお願いします。
 
　私のPython環境について。
・macOS Sequoia(M1)
・pyenv 2.4.13 (brewでインストール)
・Python 3.12.2 (pyenvでインストール)

IDE(総合開発環境)：VScode or Python IDLE

## 長い記事の要約
　通常よりもPythonが便利に使える導入方法を紹介するよ！
　でもちょっと時間がかかるかもしれないよ！
　急ぎの方、導入に時間をかけたくない方は公式から導入しようね！

 https://www.python.org/downloads/

## Homebrewとは？
　mac,Linux向けのパッケージマネージャー。とても便利。
　パッケージマネージャーとはなんぞやと言われると……答えに窮する。まあ、色々なソフトとかツールのインストール・アップデートを一括管理してくれる感じのやつです。
　この記事はbrewそのものをメインにしてないのであまり詳しくは語りません。brew使ってない人はそんなに多くないと思うし。
　一応公式サイトや導入関係のリンクは貼っときますね。
 
https://brew.sh/ja/

https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

　winの人はこの記事の対象外って感じになりますが、brewに似たパッケージマネージャーはあったはずです。多分。
 
## pyenvとは？
　Pythonのインストールからバージョン管理までの環境構築をやってくれるツール。こちらもとても便利。色々インストールの仕方があると思いますが、タイトル通りここではbrewで導入します。
　これだけじゃメリットがわからん！っていう人のためにもう少し詳しく解説すると、Pythonに限らずソフトウェアは更新するに越したことはないですよね。しかし、公式のインストーラーを使ってPythonを導入する場合、バージョンを上げるたびに毎度公式サイトを訪問してダウンロードしなきゃいけないんです。
　それがバージョン管理機能をもったツールで導入をすると、コンソールに`brew upgrade`などと打ち込むだけでアップデートが完了してしまいます。pyenvだとちょっと違いますけど。
　プログラミング言語というのはバージョンによってサポートされる構文が違うため、アップデートは一大作業になりがちです。ところが、pyenvでは過去インストールしたバージョンを一回のコマンド打ち込みだけで復元できちゃうので、一大作業にならずに済みます。
　バージョンごとにパッケージを分けて管理しているため、アップデートのコマンドで更新するというよりはHomebrewで異なるパッケージをインストールする感覚に近いですね。
　しかし、pyenvもツールなんだからそれ自体に更新の必要性が生まれるじゃないか！という反論があるわけですが、pyenvのバージョンはさらにその上のバージョン管理ツール、Homebrewで上げます。じゃあHomebrewは？というと、こいつの場合自分のバージョンを自分自身で管理するので問題ないです。

## 具体的な説明の前に
　Pythonにも色々あるので、導入の前にその辺の解説をば。
　ファイル形式とか一択だろ！エディタも決めてる！環境の話をはよせえや！って人は飛ばしてください。
 
### .py VS .ipynb
　`.py`と`.ipynb`。前者は普通のpythonファイルの拡張子。後者はjupyter notebookという普通じゃないpythonファイルの拡張子です。pyファイルは公式のフォーマットで、テキスト形式のファイル。ipynbファイルは中でソースコードが分割されており、細かい単位でデバックができる高機能かつ専用フォーマットなファイルです。
　高機能とか専用フォーマットって聞くとすごそう（というか機能は実際便利）ですが、一般的なプログラミング言語のフォーマットじゃないので開けるエディタが限られてます。またPython特有のフォーマットでもあるので、初心者がこれに慣れるとJavaやCを触った時に地獄をみるでしょう。
　業務が関わらないならぶっちゃけ好みですね。デバッグなどの機能も自分でコードいじれば同じことできますし。

### IDE（総合開発環境）の話
　何やら仰々しいですがエディタの話です。まず、pyファイル。これはpythonに対応してるエディタどころかwinのメモ帳とかmacのテキストエディットとか(ごめんなさい、Linuxの例は知らないです)でも書けます。
　……いや、ただのテキストエディタは正確にはIDEじゃないですけどね。
　私の場合はMicrosoftのVisual Studio Code(VScode)か、Python公式が出してるPython IDLEってやつを使ってます。学生が個人で触ってるアレなので実際の業務は知らないですが、前者は超有名でユーザーも多いですね。なにしろこの世に存在してる大半のプログラミング言語はおそらくアレで書けるので。gitとも連携してるし。後者はsimple is bestの一言に尽きる。
　GUIは嫌だ！CUIがいい！という方はemacsとかが良いんじゃないでしょうか。
　で、問題のipynbファイル。これはanacondaという多機能そこそこ重め専用エディタを使うか、VScodeで拡張機能のJupyterを使うかです。
　あとは全然知らないですけどminicondaというツールでanacondaの持つ機能の一部だけ導入とかできるみたいですね。
　エディタの導入の話も後でするので、それぞれの概要だけ書いておきます。

## 実際の導入
　やっと本題です。あ、Homebrewは入ってる前提でお願いしますね。ちょっとbrewの話まで入れると記事が長すぎるので……。公式サイト貼ってるし。

### tcl-tk
:::note alert
pyenvで環境構築をする場合は先にtcl-tkというフレームワークを入れた方がいいです。というか入れないと後で苦労します。入れ方は下の日本語の記事、それから英語の記事をブラウザの機能で翻訳して読んでください。日本語の記事の方だとbash（macの古いシェル）になってるので、両方に目を通すことを勧めます。
どうしても入れられない方、見てもわからないという方はここまで読んでもらって申し訳ないですが公式インストーラーで環境構築した方がいいです。
tcl-tkがないことは結構問題なので。
:::

https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3

https://stackoverflow.com/questions/61870688/cant-run-idle-with-pyenv-installation-python-may-not-be-configured-for-tk-m

　__簡単な抜粋__
　ターミナルを開き、
 ~~~
 brew install tcl-tk
 ~~~
 した後のログ、もしくは
 ~~~
 brew info tcl-tk
 ~~~
 に書かれているコマンドをコピペしてパスを通す。

　逃避用のPython公式サイト

 https://www.python.org/downloads/

### pyenv
　最初にコマンドラインでpyenvをインストールします。
~~~
brew install pyenv
~~~
　インストールが終了すると、突然コマンドラインでpyenvが使えるようになります。brew最強！
　次にインストールするパッケージを選びます。とりあえずダウンロード候補を全部表示させましょう。
~~~
pyenv install --list
~~~
　表示は長いので割愛するとして、なんかたくさん出てきます。何か明確な理由がない限り、インストールするのは「数字のもののうち、英字がついていないパッケージの一番下」、「anaconda3のうち年月日じゃない方の一番下」、「minicondaのうち一番下（たぶん）」のいずれかを推奨します。pyファイルがメインの方は数字のやつ、ipynbファイルがメインで高機能なエディタを使いこなせる、使いこなす気がある方はanacondaです。使いこなせる自信のない方はminicondaとなりますが、正直使ったことないのでminicondaを選ぶ方は別の記事を……。
　個人的な意見としてはpyの環境構築を済ませ、VScodeでJupyterを動かすことを勧めたいです。もっとも私がそうであるだけなので、ipynbファイルに関してはさらなる情報収集をすべきでしょう。
　さて、パッケージを選べたらあとは一瞬ですね。
~~~
pyenv install 表示名
~~~
　これでオッケーです。「表示名」のところは`--list`で表示させたやつの名前に置き換えてください。あとは現在選ばれているPythonバージョンを確認して……。
~~~
pyenv versions
~~~
~~~:
  system
  3.12.0
* 3.12.2 (set by /Users/username/.pyenv/version)
~~~
　こんな感じで先ほどインストールしたパッケージの前に`*`がついてればできてます。できていない場合はバージョンを変更しましょう。
~~~
pyenv global 表示名
~~~
　打ったら確認。
~~~
pyenv versions
~~~
　念の為本体の方も確認しましょう。
~~~:py
python --version
~~~
~~~:自信ないけどanacondaは多分こう
conda info
~~~
　pyenvで設定したバージョンと一致していたら問題ありません。これにて環境構築完了です。
　バージョンを切り替える際は`install --list`のところから新しいバージョンを選んでやり直せばできますよ！
 
## おまけその1：エディタ
　VScodeはここからどうぞ。

https://code.visualstudio.com/Download

　CUIで操作するエディタ、emacsが気になる方はbrewで導入してください。
 ~~~:完全CUI
 brew install emacs
 ~~~
 ~~~:窓開いて立ち上がる版
 brew install --cask emacs
 ~~~

　話に出してたPythonIDLEはpyenvだと面倒くさいかもしれません。まあ、機能的にはVScodeで問題ないと思います。私は昔からこれを使ってるせいでVScodeより馴染みがあるんですけどね。
　どうめんどくさいかというと、本来Pythonを入れるとIDLEは勝手についてきます。しかし、pyenvインストールだと二つの問題が発生します。私の環境ではそうなっただけかもしれないので、試す価値はあると思いますが。
　一つ目はアプリ版が手に入らず実行ファイルのみになってしまうこと。私の場合は`subprocess`モジュールで実行ファイルを開くプログラムを作り、`pyinstaller`で手動アプリ化し解決。
　二つ目はIDLEを実行するのに必要な`tkinter`の前提フレームワーク`tcl-tk`を別途入れなければならないこと。これはIDLEに関係なく問題ですね。導入の冒頭に書いた通りに`tcl-tk`を入れられなかった人は`tcl-tk`を入れてからpythonを再インストールしてください。使い始めたあとだと結構大変ですが使い始める前なら傷は浅いです。

https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3

https://stackoverflow.com/questions/61870688/cant-run-idle-with-pyenv-installation-python-may-not-be-configured-for-tk-m

## おまけその2：コマンドラインの備忘録
　なんでこんなものを用意するかって？`pip`と`pyenv`と`brew`のコマンドがごちゃごちゃになるんですよ！

 ・ダウンロード済みリスト表示
 ~~~
 pip list
 brew list
 pyenv versions
 ~~~
 ・pyenv パッケージ確認
 ~~~
 pyenv install --list
 ~~~
 ・自分自身のアップデート
 ~~~
 pip install --upgrade pip
 brew update
 ~~~
 ・パッケージのアップデート
 ~~~
 pip intsall --upgrade package
 brew upgrade
 ~~~
 ~~~
 pyenv install version-name
 pyenv global version-name
 ~~~
 ## 参考・リンク

 https://www.python.org/downloads/

 https://brew.sh/ja/

 https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

 https://qiita.com/mogom625/items/b1b673f530a05ec6b423

 https://qiita.com/kokorinosoba/items/ecceaabe07d91c6f2c66

 https://qiita.com/empty948/items/684a0c1e515fa3f2997d

 https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3

 https://stackoverflow.com/questions/61870688/cant-run-idle-with-pyenv-installation-python-may-not-be-configured-for-tk-m