I am Charmie

メモとログ

Pythonパッケージマネージャ

pyenv, venv, poetryあたりの違いと,各OSでの向き不向きを調べる (この記事を参考にする)

そもそもやりたいこと

  1. クロスプラットフォームでの開発
    • そもそもクロスプラットフォームでどうこう考えることが愚かなのかもしれない.
    • Ubuntu以外は全てUbuntu on Dockerにしちゃえば楽?って気がしてきた
    • 一通り調べてみてから,Ubuntu on Dockerでやろうと思う
    • コンテナ実行環境はPodmanというものがいいという情報を見かけたので,そのあたりも調べてみる
  2. 基本的にpython
  3. プロジェクト毎にpythonのバージョンや必要なライブラリが違う
  4. 一部のプロジェクトでの要件
  5. USBポートに接続したカメラを使用
  6. 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.dependenciesPythonのバージョンは明示的に設定する
    • 必要なパッケージ・バージョンも記載できる ‐ 記述したパッケージをインストールするには,poetry install コマンドを実行する
  • poetry add PACKAGE: パッケージをインストールすると共に, pyproject.tomlpoetry.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種類存在

  1. package mode
    • デフォルト ‐ プロジェクトをパッケージ化する・wheel化する ‐ メタデータnameversion)が必要
  2. 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" }
]