Pythonパッケージマネージャ
pyenv, venv, poetryあたりの違いと,各OSでの向き不向きを調べる (この記事を参考にする)
そもそもやりたいこと
- クロスプラットフォームでの開発
- そもそもクロスプラットフォームでどうこう考えることが愚かなのかもしれない.
- Ubuntu以外は全てUbuntu on Dockerにしちゃえば楽?って気がしてきた
- 一通り調べてみてから,Ubuntu on Dockerでやろうと思う
- コンテナ実行環境はPodmanというものがいいという情報を見かけたので,そのあたりも調べてみる
- 基本的にpython
- プロジェクト毎にpythonのバージョンや必要なライブラリが違う
- 一部のプロジェクトでの要件
- USBポートに接続したカメラを使用
- GPUを深層学習に使用
パッケージマネージャの機能
この比較を見る限り,Poetryを使うとパッケージのインストール・切替の両方をPoetryでやる,venvを使うとパッケージのインストールはpipで切替はvenvでやる ‐ pyenvで管理しているpythonのバージョンとvenv/poetryで管理するパッケージの紐づけができればいいのかな
Pythonのバージョン管理: pyenvが良さそう
- パッケージのバージョン管理: デフォルトでインストールされるvenvかPoetry ‐ venvは依存関係の管理ができないっぽい ‐ Poetryは
- パッケージのインストール
Pythonのバージョン管理(pyenv)
$(pyenv root)/shims: pyenvのコアなファイルが保存されるディレクトリ($PATHの先頭に追加しないとだめ)$(pyenv root)/versions/: 各pythonがインストールされるディレクトリ$(pyenv root)/versions/2.7.8/$(pyenv root)/versions/3.4.2/$(pyenv root)/versions/pypy-2.4.0/
$(pyenv root)/version: globalで使用するpythonのバージョン情報を管理するファイル
パッケージの管理(Poetry)
以下のように設定する
mkdir my-project cd my-project pyenv install 3.11.3 pyenv local 3.11.3 poetry init poetry install poetry add numpy
| . | MacOS | Linux/Unix | Windows |
|---|---|---|---|
| インストール場所 | ~/Library/Application Support/pypoetry |
~/.local/share/pypoetry |
%APPDATA%\pypoetry |
| PATH追加 | ~/Library/Application Support/pypoetry/venv/bin/poetry |
~/.local/share/pypoetry/venv/bin/poetry |
%APPDATA%\pypoetry\venv\Scripts\poetry |
- PoetryはPythonインタプリタのインストールは行わない
‐
If you use a tool like pyenv, you can use the experimental configuration value virtualenvs.prefer-active-python.と書いてある ‐poetry new YOUR-PROJECTで以下の構造のディレクトリが作成される poetry config virtualenvs.in-project trueコマンドを実行すると仮想環境がプロジェクトディレクトリ内に作成される
poetry-demo
├── pyproject.toml
├── README.md
├── poetry_demo
│ └── __init__.py
└── tests
└── __init__.py
pyproject.toml の中身
pyproject.toml: プロジェクトに関する情報と依存関係を保存するファイルtool.poetry.name: パッケージ名と同じじゃないとだめ ‐ Pythonのバージョンは明示的に設定しないとだめ ‐tool.poetry.dependencies‐ Pythonのバージョンは明示的に設定する- 必要なパッケージ・バージョンも記載できる
‐ 記述したパッケージをインストールするには,
poetry installコマンドを実行する
- 必要なパッケージ・バージョンも記載できる
‐ 記述したパッケージをインストールするには,
poetry add PACKAGE: パッケージをインストールすると共に,pyproject.tomlとpoetry.lockに記入される
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Sébastien Eustace <sebastien@eustace.io>"]
readme = "README.md"
packages = [{include = "poetry_demo"}]
[tool.poetry.dependencies]
python = "^3.7"
pendulum = "^2.1"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
モード
2種類存在
package mode- デフォルト
‐ プロジェクトをパッケージ化する・wheel化する
‐ メタデータ(
nameやversion)が必要
- デフォルト
‐ プロジェクトをパッケージ化する・wheel化する
‐ メタデータ(
non-package mode: ‐ パッケージ化ではなく依存関係の管理が目的
[tool.poetry] package-mode = false
既存のプロジェクト
‐ poetry initコマンドで既存のディレクトリをpoetryで管理できる
‐ pyproject.toml を再帰的に作成する
[仮想環境での使用
Poetryの公式マニュアルに書いてあるけど,よくわからなかった...
‐ Poetryはデフォルトで {cache-dir}/virtualenvs 内に仮想環境を作成する
‐ cache-dir の値はPoetryのconfigurationを編集することで変更できる
‐ 設定変数 virtualenvs.in-project を使えば,プロジェクトディレクトリ内に仮想環境を作成できる
(自作)packageの指定
ここに例が書いてある
[tool.poetry]
# ...
packages = [
{ include = "my_package" },
{ include = "extra_package/**/*.py" },
]
[tool.poetry]
# ...
packages = [
{ include = "my_package", from = "lib" },
]
- ここに書いてあることも正しいっぽい
- 上のやり方が正しいっぽい
[tool.poetry.dependencies]
# directory
my-package = { path = "../my-package/", develop = false }
# file
my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }
Ubuntu 22.04の設定
手順1 pyenvのインストール
# 必要なパッケージをインストール sudo apt install build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev libopencv-dev tk-dev git # pyenvをインストール curl https://pyenv.run | bash
add the following to the end of ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)"
手順2 pyenvでpythonをインストール
pyenv install --list pyenv install 3.11 pyenv global 3.11.10
手順3 poetryのインストール
以下のコマンドでインストールできる
curl -sSL https://install.python-poetry.org | python3 -
~/.bashrc の最後に以下を追加
export PATH="$HOME/.local/bin:$PATH"
仮想環境をプロジェクト ディレクトリ内に作成する設定
# すべてのプロジェクトに適用 poetry config virtualenvs.in-project true # カレントプロジェクトにのみ適用 poetry config --local virtualenvs.in-project true
手順4 poetryで仮想環境を作成
mkdir my-project && cd my-project poetry init poetry install
プロジェクトに必要なパッケージをpoetry initで指定した場合は、my-projectというパッケージが存在しないとWarningが出るため、以下の設定が必要
# 空のプロジェクトを作成 mkdir -p src/my-project touch src/my-project/__init__.py
pyproject.toml の [tool.poetry] ブロックの最後に以下を追加
packages = [
{ include = "my-project", from = "src" }
]