はじめに
備忘録
poetryの使い方をまとめたのでqiitaに残しておく
npm(jsのpackage管理ツール), pip, poetryの比較も最後に載せておく
npmがわかる人向けに端的にまとめると、python
のinstall時にくっついてくるpip
はグローバルインストールしかできないし、package.json
みたいな依存関係を表すファイルを生成してくれない。
poetry
を使うと、ディレクトリ単位でpackage
を管理できて 依存関係ファイルも生成してくれて楽
poetry
パッケージ管理を行う。
プロジェクト環境を隔離する (仮想速度を作る)
installしたpackageは.venvに保存される。
.venvは仮想環境であるため、コマンド実行は仮想環境で行う
初期化
# 既存アプリの場合 (npmの使い方に似てるのでこっちが好き)
poetry init
# 新規アプリの場合
poetry new <dir_name>
package追加
poetry add [package]
# 開発環境でのみ
poetry add --dev [package]
削除
poetry remove [package]
既存のpyproject.tomlを利用してinstall
poetry install
# 本番環境のみ
poetry install --no-dev
package一覧
poetry show
仮想環境
仮想環境で実行することで、ホストの環境によってエラーが出ることを防げる
同一ホストで複数のアプリを開発している際、他の影響を受けなくなる
# 仮想環境でコマンドを実行する
poetry run [コマンド]
# 例
poetry run python main.py
pythonの仮想環境とはインストールしたmoduleやpackage、
Pythonのversionごとに分離された環境のこと
# 仮想環境に入る
poetry shell
仮想環境の管理
# 仮想環境一覧
poetry env list
# 仮想環境削除
poetry env remove [id]
poetry config --list
# 同一階層に仮想環境ファイル (.venv)を作るようにする
poetry config virtualenvs.in-project true
# 仮想環境を作らないようにする
# コンテナで実行する場合などに有効
# パッケージのインストール先がシステム環境のpythonに紐づく
poetry config virtualenvs.create false
# 該当プロジェクトでのみ有効にする
poetry config virtualenvs.create false --local
globalのpackageと仮想環境のpackageを併用できる
pyproject.toml
プロジェクトの依存関係を管理する
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["“tee” <“asuasu.tee@gmail.com”>"]
readme = "README.md"
packages = [{include = "poetry_demo"}]
[tool.poetry.dependencies]
python = "^3.10"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
npmとの比較
npm
はjavascriptのpackageマネージャーです。
// npmのpackageのインストール方法は3つあります。
// ローカルインストール (ディレクトリ内部にnode_modules/を作成してその中にいれる)
npm i [package]
// ローカルインストール && 開発時のみ (node_modules/に入れる 本番環境では利用されない)
npm i -D [package]
// グローバルインストール (システムで使用しているnodeに紐づいてinstallされる)
npm i -g [package]
pip
pythonのpackageマネージャー
# グローバルインストール (システムで使用しているnodeに紐づいてinstallされる)
pip install [package名]
そうpipは強制的にグローバルインストールになっちゃいます。
npmみたいにディレクトリ単位で管理できないので、いろんなプロジェクトで使用したパッケージがごちゃごちゃ混ざって競合します。
そこでpoetry
です。
poetry
を使えば各アプリケーション(ディレクトリ)単位でpackageを管理できます。
下記設定をすれば、.venv
はディレクトリ内部につくられるようになるのでnpmと似た感覚で使えます
# 同一階層に仮想環境ファイル (.venv)を作るようにする
poetry config virtualenvs.in-project true
またpip
はnpm
でいうところのpackage.json
を生成しないので、コンテナでの管理が面倒です。requirement.txt
というファイルを手動で管理する形になります。
poetry
を使うとpoetry.lock
やpyproject.toml
を生成してくれるので管理が楽です
終わりに
なんでpip
はグローバルインストールしかできないのだ?
npm
を見習ってほしいのだ
もしかしてできるのだ? いやできないのだ
野田