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番詳しくなるために 行動 するマインドセット
ご清聴ありがとうございました
巨人の肩に乗りまくっていきましょう!