🐍

poetry+pyenvでつくるお手軽開発環境

2022/07/04に公開

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.103.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 -

参考: Documentation|poetry

インストール出来たか確認してみましょう.

$ 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 addpoetry 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: 後日執筆予定

GitHubで編集を提案

Discussion