What's this?
macbookのPython環境を
- pyenv
- poetry
- pipx
で構築したので, そのメモです.
環境はmac OS 10.14.6 Mojaveです.
この記事はintel macでの環境構築の話です.
M1 macで同じ手順で環境構築できるかは知りません(持ってないので).
デフォルトシェルがbashからzshに変わった等の違いはありますが, intel macであれば2021年現在も同じように環境構築可能です.
homebrewはすでに入っている前提で進めます.
(homebrewを入れてない人はHomebrew公式を参考にして入れてください)
適宜更新していくと思います.
Python3のインストール
homebrewでsystemのpython3をインストールします.
すでに入れてる人は飛ばしてください.
また, 「どうせ後でpyenv入れるんやろ. pyenvで入れるからええわ」って人も飛ばしてください.
systemにpython3をインストールするのは僕の趣味です.(~~あと, なんかよくわかんないけど, pyenv上のpythonでnumpy,scipyをmklとリンクさせようとすると失敗するから...~~何とかなりました.詳しくはここ)
$ brew install python
(2020.07.12追記)
homebrewからpythonフォーミュラが消えました.
python@3.7かpython@3.8の好きな方を選んでください.
(というかここまできたらもうシステムにインストールせんでもええのでは...)
pyenvのインストール
公式に従って pyenv を入れます.
brew install pyenv が楽なのだろうけど, PYENV_ROOT=/usr/local/var/pyenv となるのがあまり好きではない(完全に趣味です.Linux環境となるべく同じにしたいという思いもある.)ので, git で入れます( brew install pyenv でも全然問題ないです).
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
でインストールした後, PATH を通す & pyenv init を実行するように.bash_profileを編集します.
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
シェルを再起動すれば, pyenv が使えるようになります.
systemにpython3をインストールしてない人はここで pyenv install 3.7.6, pyenv global 3.7.6 をするなりしてください.
pyenv install が失敗する場合は, https://developer.apple.com/download/more/?=command%20line%20tools から最新のcommandlinetoolsをインストールすると上手くいくかも.
poetryのインストール
公式に従います.
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3
また自分の趣味ですが, プロジェクトのディレクトリに .venv を作るようにするために
$ poetry config virtualenvs.in-project true
を実行します.
この辺りの設定は
$ poetry config --list
で見ることができます.
pipxのインストール
「そもそもpipxって何なん?」って人向けにざっくり説明すると...
pipでインストールするアプリケーション(コマンド)あるやん(sphinx-quickstartとか).
そういうやつってだいたいどの仮想環境でも使うやん.
やけど仮想環境全てにインストールするの面倒やん.
そこで, そういうpipで入れるアプリケーション(コマンド)をグローバルに使えるようにするやつ
です.
公式はここ.
そういうのいらんわって人は無視して次に進んでください.
homebrewでpythonをインストールした人は
$ brew install pipx
$ pipx ensurepath
pyenvで入れたpythonをglobalにしてる人は
$ python3 -m pip install --user pipx
$ python3 -m pipx ensurepath
tab補完を有効にするために次を .bash_profile に追加.
eval "$(register-python-argcomplete pipx)"
これで一通り終了です.
お疲れ様でした.
poetryで環境をつくる
poetryで環境を作るときの方法はpoetry newとpoetry initの2つあって, ざっくり説明すると
poetry new my-package- ディレクトリを作って, その下にpackageの雛形を作ります.
- ディレクトリ構造はこうなる
my-package
├── pyproject.toml
├── README.rst
├── my_package
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
poetry init- 質問に答えて, コマンドを実行したディレクトリに
pyproject.tomlを作成する.
パッケージを作る場合はpoetry new <my-package>, そうでない場合はpoetry initという認識で良いと思います.
多分後者の場合が多いのでここではpoetry initを使って環境をつくります.
まず, プロジェクトで使用するpythonをpyenvでインストールします.
ここでは3.7.4を使うとします.
$ pyenv install 3.7.4
プロジェクト用のディレクトリを作成する.
$ mkdir /foo/bar/project
pyenv localで使用するpythonのバージョンを指定した後, poetry init.
$ cd /foo/bar/project
$ pyenv local 3.7.4
$ poetry init
(聞かれたことに対して答えるとpyproject.tomlが生成される)
(質問を無視して後でpyproject.tomlを編集してもよい)
(そもそも自分でpyproject.tomlを作ってもよい)
poetry installでpyproject.tomlに書かれた通りにパッケージをインストールできます.
$ poetry install
(これでpyproject.tomlに書いたパッケージがインストールされる)
(この時点で`.venv`も作られる)
poetry add <package>でもパッケージを追加することができます.
poetryの使い方について, 詳しくは公式のドキュメントを見て下さい.
最初にpoetry addやpoetry installを使用したときに仮想環境(.venv)は自動で作成されますが, その前に python -m venv .venv などとして仮想環境を作ってもよいです.
そんな必要あるのと思うかもしれませんが, pip.conf を必要とする時にはこうするしかないっぽいので(これ以外の方法を今のところ僕は知りません).
pip.conf は .venv 以下において下さい(.venv/pip.confとなる).
ちなみに, 僕の場合, systemのpython3のpip.conf($HOME/.pip/pip.conf)が
[install]
no-binary = numpy,scipy
[wheel]
no-binary = numpy,scipy
となっており, 何もしないとこの影響を受けてしまいます.
なので, numpy, scipyを使うときは, .venv/pip.confを以下の内容でわざわざ作ってます.
[install]
no-binary =
[wheel]
no-binary =
mklの関係で工夫しないとnumpy, scipyのbuild失敗するんでこうしてます(このあたりは後で記事にします記事にしました→pyenv+poetry環境下のnumpy,scipyでmklを使いたい).
(pipx使用例)pipxでsphinxをインストール
pipx については使用例を見てもらった方が良いと思うんで, pipxを利用してsphinxをインストールする手順を紹介します.
前述の通りsphinxを全ての仮想環境に入れるの面倒(というか絶対やらない)なので, pipxの出番です.
$ pipx install sphinx
sphinx_rtd_themeやsphinxcontrib-blockdiagを使いたいときは,
$ pipx inject sphinx sphinx_rtd_theme
$ pipx inject sphinx sphinxcontrib-blockdiag
とすればよいです.
最後に
今まではpipenvを使っていたけど, pipenvに比べてpoetryはpackageのインストールが速くてよいですね.
ただ, あまりパッケージ作ることないので, poetry である必要があるかと言われるとそうでもない.
他に良さそうなのが出てきたらまた乗り換えるかも(ずっとこれ繰り返してる...ゴールはあるんでしょうか)