poetry+pyenvでつくるお手軽開発環境
1. これはなに 👶
-
Pythonのバージョン管理ツール
pyenv
-
パッケージ管理および仮想環境構築のためのツール
poetry
上記2つを用いてお手軽にPythonの開発環境を構築していきます.
たまに仮想環境をpoetry
でなくpyenv-virtualenv
にさせているものも見かけますが,
この記事では使用しません.
何番煎じなんだというテーマですが,自分のメモ用も兼ねて書き進めます.
2. pyenvによるバージョン管理 🔢
2-1. pyenvのインストール
公式のGitHubからインストール
-- 公式のレポからインストール
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
-- コンパイルすることで高速化(仮に失敗しても問題なく動く)
$ cd ~/.pyenv && src/configure && make -C src
MacならHomebrewから入れることも出来ます.
また筆者本人は利用していないのですが,pyenvのインストーラーも用意されているのでそちらを用いるのが今だと手軽そうです.
※ インストーラーを利用した場合はおまけの項目で書いたpyenv-update
のプラグインが始めから入っているのも嬉しい
2-2. pyenvによるバージョンコントロール
pyenvでインストール可能なPythonの一覧を表示します.
$ pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
--省略--
3.7.10
--省略--
3.8.2
--省略--
今回はバージョン3.7.10
と3.8.2
をインストールしようと思います.
$ pyenv install 3.7.10
$ pyenv install 3.8.2
次は,現在pyenvによって選択可能なバージョン一覧を表示してみます.
$ pyenv versions
* system
3.7.10
3.8.2
systemというのは元からコンピュータに入っているPythonのことを指しています.
次に使用するバージョンを指定します.今回は3.8.2
を指定してみます.
-- どのディレクトリ(フォルダ)でも使用するPythonのバージョンが3.7.10となる
$ pyenv global 3.7.10
実際に下記各種コマンドでPythonのバージョンが3.7.10
になったことが確認出来ます.
$ python --version
Python 3.7.10
$ pyenv version
3.7.10 (set by /home/あなたのユーザー名/.pyenv/version)
$ pyenv versions
system
* 3.7.10 (set by /home/あなたのユーザー名/.pyenv/version)
3.8.2
3. poetryによる仮想環境構築とパッケージ管理 🌏
3-1. poetryのインストール
MacやLinuxの場合下記でインストールします.
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
インストール出来たか確認してみましょう.
$ poetry version
Poetry version 1.1.11
3-2. poetryによるPJセットアップ
前節で説明したpyenvを用いたバージョン指定とインストールが済んでいることを
前提として話を進めます.
$ pyenv versions
system
* 3.7.10 (set by /home/あなたのユーザー名/.pyenv/version)
3.8.2
3-2-1. poetryによるインタラクティブなPJ設定
プロジェクトを始めるディレクトリを作ります.
今回は~/Documents
の下に作ります.
$ cd ~/Documents
-- ディレクトリ名は適当
$ mkdir pp-practice
$ cd pp-practice
プロジェクトのセットアップを始めます.今回はpoetry init
で始めます.
※ PythonでCLIツールとか作るPJをやるのならpoetry new
でやるのもあり
インタラクティブ(対話的)にパッケージの設定を指定していきます.
[]
の中にあるのはデフォルトの値でデフォの値にしたいのならエンターで進めれば良いです.
$ poetry init
This command will guide you through creating your pyproject.toml config.
-- パッケージネームを指定
Package name [pp-practice]:
-- パッケージバージョン
Version [0.1.0]:
-- パッケージ説明
Description []:
-- パッケージAuthor指定
Author [あなたのユーザー名 <hogehogemail@example.com>, n to skip]:
-- ライセンスを指定, MITとか
License []:
-- 対応するPythonバージョン, 今回は3.7以上にしました
Compatible Python versions [^3.8]: ^3.7
-- 対話的にPJの依存パッケージを入れるか
Would you like to define your main dependencies interactively? (yes/no) [yes] no
-- 対話的にPJの開発用の依存パッケージを入れるか
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file
[tool.poetry]
name = "pp-practice"
version = "0.1.0"
description = ""
authors = ["あなたのユーザー名 <hogehogemail@example.com>"]
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
-- 上記設定でPJを作って良いか
Do you confirm generation? (yes/no) [yes] yes
上記設定が終わるとpyproject.toml
というプロジェクトのパッケージ依存関係を
記述したファイルが出来上がります.
このpyproject.toml
を手で編集してインストールするパッケージを追加や削除することも出来るのですが,
poetry add
やpoetry remove
といったコマンドで行うことも出来ます.(後ほどの節でやるので今はスルーで良いです)
3-2-2. poetryで仮想環境構築
続いてpoetryに使用するPythonバージョンを教えます.
$ poetry env use 3.7.10
Creating virtualenv pp-practice-vAysUxcS-py3.7 in /home/あなたのユーザー名/.cache/pypoetry/virtualenvs
Using virtualenv: /home/あなたのユーザー名/.cache/pypoetry/virtualenvs/pp-practice-vAysUxcS-py3.7
この後は,globalのPythonのバージョンをpyenv
で変えても問題ないです.
$ pyenv global 3.8.2
$ pyenv version
3.8.2 (set by /home/kumamoto/.pyenv/version)
仮想環境で指定したバージョンのPythonで実行します.
$ poetry run python 実行ファイルのパス
上記は実行後は仮想環境から出るイメージ
仮想環境に入りっぱなしにするには,
$ poetry shell
. /home/あなたのユーザー名/.cache/pypoetry/virtualenvs/pp-practice-vAysUxcS-py3.7/bin/activate
(pp-practice-vAysUxcS-py3.7) $
3-3. poetryによるパッケージ管理
poetry init
した際にPJに必要なパッケージ(ライブラリ)をインタラクティブに入れることも
出来るのですがPJ開始後に入れたいものも出てくるでしょう.
そんな場合もpip
でなくpoetry
を使用しましょう.
-- PJに必要なパッケージをインストール(@x.xでバージョン指定も出来る)
$ poetry add djago@3.2
Updating dependencies
Resolving dependencies... (0.3s)
Writing lock file
-- インストールしたパッケージに必要な依存パッケージをいい感じに入れてくれる
Package operations: 5 installs, 0 updates, 0 removals
• Installing typing-extensions (4.3.0)
• Installing asgiref (3.5.2)
• Installing pytz (2022.1)
• Installing sqlparse (0.4.2)
• Installing django (3.2)
PJの開発に必要なもの(例えばフォーマッタなど)は-D(--dev)
オプションを付けて
インストールします.
-- PJの開発に必要なパッケージをインストール
$ poetry add -D black
Using version ^22.6.0 for black
Updating dependencies
Resolving dependencies... (0.7s)
Writing lock file
Package operations: 9 installs, 0 updates, 0 removals
• Installing zipp (3.8.0)
• Installing importlib-metadata (4.12.0)
• Installing click (8.1.3)
• Installing mypy-extensions (0.4.3)
• Installing pathspec (0.9.0)
• Installing platformdirs (2.5.2)
• Installing tomli (2.0.1)
• Installing typed-ast (1.5.4)
• Installing black (22.6.0)
Writing lock file
と表示がされていますがディレクトリ内にpoetry.lock
というファイルが
新しく生成されているのを確認出来るはずです.
pyproject.toml
では許容するバージョン範囲を指定するなど緩い記述も出来ますがpoetry.lock
は
厳格にどのバージョンのパッケージをインストールするかを指定します.
そのため,チーム開発をする際にはpyproject.toml
でなくpoetry.lock
をコミット対象にするべきです.
ちなみにチーム開発に後から入ることになった際,にPJをgit clone
した最初はpoetry.lock
しかないと思いますが,
そんな時は指定のPythonバージョンをpyenv
で入れた上で,poetry install
すれば良いです.
$ cd ~/あなたのPJパス
$ poetry install
いらないパッケージはremove
で消せます.
$ poetry remove django
4. おまけ いろいろ 🍦
4-1. pyenvのアップデート
pyenv install --list
で必要なバージョンがリストになかった場合は,
pyenv
の情報が古い可能性があります.
pyenv-updateというpyenv
のプラグインを使うことでアップデートします.
-- インストール
$ git clone https://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update
-- pyenvのアップデート
$ pyenv update
4-2. poetryで入れたパッケージや仮想環境の設定はどこにあるのか
{cache-dir}/virtualenvs
下の各PJディレクトリ内にあります.
{cache-dir}
はMacの場合は~/Library/Caches/pypoetry
,Linuxの場合は~/.cache/pypoetry
です.
仮想環境のパスはPJ内でpoetry env info --path
することでも確認出来ます.
$ cd ~/Documents/pp-practice
$ poetry env info --path
-- 筆者のLinux環境の場合
/home/あなたのユーザー名/.cache/pypoetry/virtualenvs/pp-practice-vAysUxcS-py3.7
実際に{cache-dir}/virtualenvs
に移動して確認してみます.
$ cd {cache-dir}/virtualenvs
$ ls
envs.toml pp-practice-vAysUxcS-py3.7
-- envs.tomlの中にはPJで使用するPythonのバージョンが記載されている
$ cat envs.toml
[pp-practice-vAysUxcS]
minor = "3.7"
patch = "3.7.10"
-- PJ内に自分で入れたパッケージがある
$ cd pp-practice-vAysUxcS-py3.7 && ls
bin lib pyvenv.cfg
4-3. PJのPythonバージョンを変える
TODO: 後日執筆予定
4-4. poetryの基本的な使い方いろいろ
TODO: 後日執筆予定
Discussion