Python開発環境 基礎
- Event:
みんなのPython勉強会#103
- Presented:
2024/04/25 nikkie
お前、誰よ(自己紹介)
ソフトウェアエンジニアリングで突破するデータサイエンティスト(We're hiring!)
みんなのPython勉強会 4代目LT王子・スタッフ
本編で発表は2年ぶり!?
Pythonを始めたい春に🌸
Python環境はおもちですか?
Is your Python environment a ricecake?
Python環境
https://www.python.org/ からダウンロード 👈
などなど
おことわり 1/2
.py
ファイルを作る方向け「Google ColabやJupyterLabで十分開発できている!」という方には使い所がないかも
おことわり 2/2
Python 3.9 以上を想定(3.8は2024年10月でセキュリティアップデート終了)
nikkieが経験しているのは、macOS とUbuntu
Windows周りは弱いです(文献で見た知識。補足求ム)
Python環境はなぜ動くのですか?
少しだけ、シェルの仕組み(※伏線です)
python3 コマンドで対話モードに入る
$ python3 -q
>>>
呼ばれているコマンド
$ /Library/Frameworks/Python.framework/Versions/3.12/bin/python3 -q
>>>
シェルの仕組み
環境変数
$PATH
からpython3
コマンドの実体を探すシェル「
python3
は$PATH
を見たところ、/Library/Frameworks/Python.framework/Versions/3.12/bin/python3
のことっぽいな!」
別の例 ls コマンド 🏃♂️
$ which ls
/bin/ls
$ type ls
ls is /bin/ls
/bin
も $PATH
に含まれます
本題へ:プログラミングでは ライブラリ を使う
巨人の肩の上
「先人の積み重ねた発見に基づいて何かを発見すること」
万有引力のアイザック・ニュートン
私がかなたを見渡せたのだとしたら、それは巨人の肩の上に立っていたからです。
巨人の肩に 乗りまくる
ライブラリ = 先人の残したコード
機械学習では scikit-learn や PyTorch などなど
Webアプリ開発では Django や FastAPI などなど
📌伝えたい:Pythonではアプリケーションごとにライブラリを分けよう
Pythonには豊富な標準ライブラリ
今回は サードパーティ ライブラリの話(
pip install
するもの)
なぜアプリケーションごとにライブラリを分ける?
1つのインストールされたPythonが全てのアプリケーションの要求に対応することは不可能です。
チュートリアルの例(を補足)
あなたはPython 3.12(だけ)をインストールした
アプリケーションAとBを開発
アプリAの開発では、
awesome
の 1.0 を使うアプリBの開発では、
awesome
の 2.0 を使う
分けよう!
アプリAの開発環境には、
awesome
の 1.0 をインストールアプリBの開発環境には、
awesome
の 2.0 をインストール分けない場合、バージョン違いが共存できない(後述)
分ける方法の1つが 仮想環境
私は公式厨なので
その他の方法(本トークのスコープ外)
Anaconda
2023年6月 stapy#94 で取り上げ
Docker
Dev Containers時代のPython開発環境のあり方 (PyCon APAC 2023)
仮想環境
アプリケーションの開発に必要なライブラリを分ける方法
仮想環境って、何よ
ディレクトリ
仮想環境は ディレクトリ
仮想環境とは、特定のバージョンの Python と幾つかの追加パッケージを含んだ Python インストールを構成するディレクトリです。
仮想環境を作るツール
標準ライブラリの venv
サードパーティの virtualenv
virtualenvが先にあり、人気を受けて標準に入った(PEP 405)
仮想環境を作る
python3 -m venv .venv --upgrade-deps
.venv
は仮想環境のディレクトリの 名前 ( パス として扱う)tutorial-env
(チュートリアル)・venv
12.2. 仮想環境の作成(Python チュートリアル) (Windowsの方はぜひ)
ディレクトリが、作られた!
.venv/
├── bin/
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.12
│ ├── python -> python3.12
│ ├── python3 -> python3.12
│ └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│ └── python3.12/
└── pyvenv.cfg
シンボリックリンク!
.venv/
├── bin/
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.12
│ ├── python -> python3.12
│ ├── python3 -> python3.12
│ └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│ └── python3.12/
└── pyvenv.cfg
あとで出てくる .venv/lib/python3.12/
.venv/
├── bin/
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.12
│ ├── python -> python3.12
│ ├── python3 -> python3.12
│ └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│ └── python3.12/
└── pyvenv.cfg
有効化するためのスクリプト
.venv/
├── bin/
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.12
│ ├── python -> python3.12
│ ├── python3 -> python3.12
│ └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│ └── python3.12/
└── pyvenv.cfg
仮想環境を有効化
source .venv/bin/activate
$ python -V
Python 3.12.3
$ .venv/bin/python -V # PATHが更新されていて、これが見つかっている
Python 3.12.3
$ type python
python is /.../.venv/bin/python
オススメ:Pythonの「仮想環境」を完全に理解しよう
🌯Pythonではアプリケーションごとにライブラリを分けよう
仮想環境 を紹介(他の方法もある)
python3 -m venv .venv --upgrade-deps
アプリケーションごとに、ライブラリをインストールするディレクトリを設ける
拙ブログより 🏃♂️
パッケージマネージャ
ライブラリ(=パッケージ)は便利だから、インストールしまくろう!
pip
venvやvirtualenvで作る仮想環境にすでにある
.venv/
├── bin/
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.12
│ ├── python -> python3.12
│ ├── python3 -> python3.12
│ └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│ └── python3.12/
└── pyvenv.cfg
pip install
$ pip install kojo-fan-art
$ pip install git+https://github.com/ftnext/unko
pip install
は何をしているのか
=ライブラリを インストール するとは
ライブラリの 実体のコードを取得 し、あなたのPython環境に置く
PyPI https://pypi.org/ やリポジトリ(GitHub)から
ソースコードが置かれるから
import
できる!
例:仮想環境で pip install httpx
実体のコードは
site-packages
というディレクトリの下にある
$ ls .venv/lib/python3.12/site-packages/httpx
import
は site-packages
を見ている 🏃♂️
仮に仮想環境を使わなかったら(真似しないでね🙅♂️)
$ python3 -m pip install httpx
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages
にhttpxのコードが置かれる
📌環境を分けるとは
仮想環境は、プロジェクト専用の
site-packages
を用意している!2つのプロジェクトで同じライブラリのバージョン違いが 共存できる
大元のPython環境には1つの
site-packages
しかないゆえに共存できない
tips✨ .venv/bin/python -m pip install
仮想環境を有効にしなくても、仮想環境にインストールできる
仮想環境のPythonを指定 した
pip コマンドを使う
チュートリアル 12.3. pip を使ったパッケージ管理
python -m pip
チュートリアル記載の方法(※nikkieは公式厨)
仮想環境を有効にして、単に pip でもよい
install / uninstall
show, list, freeze
環境を再現するには
python -m pip freeze
はインストールされたパッケージ一覧を、python -m pip install
が解釈するフォーマットで生成します。
python -m pip freeze
$ python -m pip freeze
anyio==4.3.0
certifi==2024.2.2
h11==0.14.0
httpcore==1.0.5
httpx==0.27.0
idna==3.7
sniffio==1.3.1
ライブラリとバージョンの一覧
環境を再現するコマンド
$ python -m pip freeze > requirements.txt
$ python -m pip install -r requirements.txt
freeze:動作する環境に入っているライブラリのバージョンを列挙
install:指定されたバージョンのライブラリをインストール
思うに、仮想環境は使い捨て
仮想環境のディレクトリの名前は変更できない(壊れてしまう)
作り直す (というスタンスが公式と理解した)
$ python3 -m venv .venv --clear --upgrade-deps
$ .venv/bin/python -m pip install -r requirements.txt
pip コマンドを使っていくなかで
伸びしろが感じられてきます
人力 pip freeze の功 罪
知らないと環境を再現できない
知っていても忘れたら再現できない
requirements.txt
という命名は慣習でしかない(バベルの塔感)
さらに requirements.txt
のメンテが大変
ライブラリの追加はまあできる(忘れずに pip freeze するだけ)
使っていたライブラリの 削除 がツラい(Help wanted!)
2種類の依存
プロジェクトが直接(direct)依存
直接の依存が依存(transitive)しているライブラリ
httpxを例に、2種類の依存
$ python -m pip install httpx # directの依存
Installing collected packages: sniffio, idna, h11, certifi, httpcore, anyio, httpx
Successfully installed anyio-4.3.0 certifi-2024.2.2 h11-0.14.0 httpcore-1.0.5 httpx-0.27.0 idna-3.7 sniffio-1.3.1
httpcore, idna などなどが transitiveの依存
指定したライブラリしかuninstallできない
$ python -m pip uninstall -y httpx
directの依存だけを指定しても、transitiveの依存は自動でuninstallされない
削除がツラいのは、transitiveの依存
httpxの依存するhttpcore、他のdirect依存のライブラリで使ってない。消せる!
httpxの依存するidna、 他のdirect依存のライブラリのtransitive依存 だった。消せない!
このチェックを1つ1つしていくのが大変😫
🌯なぜアプリケーションごとにライブラリを分けるのか
site-packages
というディレクトリ下にインストールされたライブラリをimport
しているアプリケーションごとにライブラリのインストール先を分けた (バージョン違い共存可能に!)
pip
が最初から使えるが、環境の再現となると伸びしろを感じる
拙ブログより 🏃♂️
閑話休題🍵 PyCon JP 2024
9/27(金)-29(日) 有明開催🌈
from everyone import PyConJP
pipのペインを解消する種々のツール
矢継ぎ早✨に紹介。気になるものはぜひドキュメントを
サンプルは🈁 https://github.com/ftnext/2024-slides/tree/main/samplecode/python-environments
pip「うう。。俺が弱くて、ごめん。。」
仮想環境とpipをラップして easy にしたツールたち曰く
仮想環境の 管理、俺達に任せて!!
環境の 再現、簡単にしといたよ!
⚠️ライブラリのインストールという観点に限る(もっと色々できます)
Poetry
$ poetry --version
Poetry (version 1.8.2)
インストール
$ curl -sSL https://install.python-poetry.org | python3 -
$ # または pipx install poetry
導入
新規プロジェクトは poetry new で作成
既存プロジェクトには poetry init で導入
Poetry「仮想環境の管理は任せて!」
poetry add / remove
poetry shell や poetry run で仮想環境を有効にして実行できる
https://python-poetry.org/docs/basic-usage/#using-your-virtual-environment
Pipenv
$ pipenv --version
pipenv, version 2023.12.1
🔰本発表を気に触ったので、補足大歓迎!
インストール
$ pipx install pipenv
https://github.com/pypa/pipenv/tree/v2023.12.1?tab=readme-ov-file#installation
導入
新規作成:空ディレクトリで pipenv --python 3.12
Pipenv「仮想環境の管理は任せて!」
pipenv install / uninstall
pipenv shell や pipenv run で仮想環境を有効にして、コマンドを実行できる
https://pipenv.pypa.io/en/latest/installation.html#installing-packages-for-your-project
時間ないのに脱線:pipxって、何よ
インストールして コマンド で使うライブラリを、隔離した仮想環境にインストールしてくれる(pipx install)
pipx run が個人的にメチャ熱い🔥🔥🔥: Pythonスクリプトの未来。pipxが部分的にサポートしたInline script metadata(PEP 723)を触る
Hatch
$ hatch --version
Hatch, version 1.9.7
🔰本発表を気に触ったので、補足大歓迎!
インストール
インストーラがある
または
pipx install hatch
導入
新規プロジェクトは hatch new で作成
既存プロジェクトには hatch new --init で導入
Hatch「pyproject.toml
書いて」
開発者が
pyproject.toml
を書く模様hatch shell や hatch run で
pyproject.toml
の通りの仮想環境 でコマンドを実行できる(宣言的だ)
PDM
$ pdm --version
PDM, version 2.15.1
🔰本発表を気に触ったので、補足大歓迎!
インストール
$ curl -sSL https://pdm-project.org/install-pdm.py | python3 -
導入
新規作成:空ディレクトリで pdm new
却下された PEP 582 をサポートしており、依存をインストールするディレクトリ
__pypackages__
を作ることもできる
PDM「仮想環境の管理は任せて!」
pdm add / remove
poetry run で仮想環境を有効にして実行できる
Rye
$ rye --version
rye 0.33.0
commit: 0.33.0 (58523f69f 2024-04-24)
platform: macos (aarch64)
self-python: not bootstrapped (target: cpython@3.12)
symlink support: true
uv enabled: false
インストール「Rust のように簡単🍰」
curl -sSf https://rye-up.com/get | bash
導入「Pythonも管理しときますね〜」
新規作成:rye init
Ryeで管理してるプロジェクトは rye sync
開発者は rye sync を叩く
rye add / remove して rye sync
rye run で仮想環境を有効にして、コマンドを実行できる
Rye「どう?簡単でしょ?」
virtualenvやpip-toolsなどの既存ツールをバンドルして、easyに提供
仮想環境
.venv
はあるが、開発者が手出しできない(nikkie「simpleなのだろうか?」)
拙ブログより 🏃♂️
uv
$ uv --version
uv 0.1.38
uvは、Rustで再実装 したvenvとpip
PythonからRustに変わったことで 高速 に動作(売りにしている)
ただし、venvやpipの複製にする気はないと明言(開発者は 覚え直し が必要)
Ryeはpipの代わりにuvを使える
インストール
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ # または pipx install uv
https://github.com/astral-sh/uv/tree/0.1.38?tab=readme-ov-file#getting-started
導入:uvで仮想環境を作る
$ uv venv
.venv
という名前の仮想環境ができるPythonのvenvやvirtualenvで作った仮想環境とは 互換性がない
uv「俺は、速い。あ、環境の再現は 人手 でお願いします」
$ uv pip install ...
$ uv pip freeze > requirements.txt
$ uv pip sync requirements.txt
参考 🏃♂️
まとめ🌯 Python開発環境 基礎
Pythonでは アプリケーションごとにライブラリを分けよう
仮想環境がアプリケーションごとの
site-packages
を提供ライブラリのインストール、pipの伸びしろを改善提案するツール群
読み替え しましょう!
Python開発環境周りは、新しいツール(具象)がどんどん出てくる(最近はRyeやuv)
具象は変化が早い。 抽象的な考え方 を押さえよう
考え方を押さえていれば具象1つ1つを読み替えて、自分の文脈に知見を適用できる
1番詳しくなるために 行動 するマインドセット
ご清聴ありがとうございました
巨人の肩に乗りまくっていきましょう!