Python開発環境 基礎

Event:

みんなのPython勉強会#103

Presented:

2024/04/25 nikkie

お前、誰よ(自己紹介)

  • nikkie / @ftnextブログ 連続520日突破

  • ソフトウェアエンジニアリングで突破するデータサイエンティスト(We're hiring!

  • みんなのPython勉強会 4代目LT王子・スタッフ

../_images/uzabase-white-logo.png

本編で発表は2年ぶり!?

Pythonを始めたい春に🌸

Python環境はおもちですか?

Is your Python environment a ricecake?

Python環境

おことわり 1/2

  • .py ファイルを作る方向け

  • 「Google ColabやJupyterLabで十分開発できている!」という方には使い所がないかも

おことわり 2/2

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 のことっぽいな!」

オススメ 「シェル」ってなに?から改めて学ぶLinuxのきほん

別の例 ls コマンド 🏃‍♂️

$ which ls
/bin/ls
$ type ls
ls is /bin/ls

/bin$PATH に含まれます

本題へ:プログラミングでは ライブラリ を使う

素振りのススメ at Python入門者の集い from Takayuki Shimizukawa

巨人の肩の上

  • 先人の積み重ねた発見に基づいて何かを発見すること

  • 万有引力のアイザック・ニュートン

    私がかなたを見渡せたのだとしたら、それは巨人の肩の上に立っていたからです。

巨人の肩に 乗りまくる

  • ライブラリ = 先人の残したコード

  • 機械学習では scikit-learn や PyTorch などなど

  • Webアプリ開発では Django や FastAPI などなど

📌伝えたい:Pythonではアプリケーションごとにライブラリを分けよう

  • Pythonには豊富な標準ライブラリ

  • 今回は サードパーティ ライブラリの話(pip install するもの)

なぜアプリケーションごとにライブラリを分ける?

1つのインストールされたPythonが全てのアプリケーションの要求に対応することは不可能です。

12.1. はじめに(Python チュートリアル 12. 仮想環境とパッケージ)

チュートリアルの例(を補足)

  • あなたはPython 3.12(だけ)をインストールした

  • アプリケーションAとBを開発

  • アプリAの開発では、awesome1.0 を使う

  • アプリBの開発では、awesome2.0 を使う

分けよう!

  • アプリAの開発環境には、awesome1.0 をインストール

  • アプリBの開発環境には、awesome2.0 をインストール

  • 分けない場合、バージョン違いが共存できない(後述)

分ける方法の1つが 仮想環境

その他の方法(本トークのスコープ外)

仮想環境

アプリケーションの開発に必要なライブラリを分ける方法

仮想環境って、何よ

  • ディレクトリ

仮想環境は ディレクトリ

仮想環境とは、特定のバージョンの Python と幾つかの追加パッケージを含んだ Python インストールを構成するディレクトリです。

12.1. はじめに(Python チュートリアル 12. 仮想環境とパッケージ)

仮想環境を作るツール

  • 標準ライブラリの 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環境に置く

  • ソースコードが置かれるから import できる!

例:仮想環境で pip install httpx

  • 実体のコードは site-packages というディレクトリの下にある

$ ls .venv/lib/python3.12/site-packages/httpx

https://github.com/encode/httpx/tree/0.27.0/httpx の内容

importsite-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種類の依存

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

pipのペインを解消する種々のツール

仮想環境とpipをラップして easy にしたツールたち曰く

  • 仮想環境の 管理、俺達に任せて!!

  • 環境の 再現、簡単にしといたよ!

  • ⚠️ライブラリのインストールという観点に限る(もっと色々できます)

Poetry

$ poetry --version
Poetry (version 1.8.2)

インストール

$ curl -sSL https://install.python-poetry.org | python3 -
$ # または pipx install poetry

https://python-poetry.org/docs/#installation

導入

  • 新規プロジェクトは poetry new で作成

  • 既存プロジェクトには poetry init で導入

https://python-poetry.org/docs/basic-usage/#project-setup

Poetry「仮想環境の管理は任せて!」

  • poetry add / remove

  • poetry shellpoetry 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 shellpipenv run で仮想環境を有効にして、コマンドを実行できる

https://pipenv.pypa.io/en/latest/installation.html#installing-packages-for-your-project

時間ないのに脱線:pipxって、何よ

Hatch

$ hatch --version
Hatch, version 1.9.7

🔰本発表を気に触ったので、補足大歓迎!

インストール

  • インストーラがある

  • または pipx install hatch

https://hatch.pypa.io/latest/install/#installers

導入

  • 新規プロジェクトは hatch new で作成

  • 既存プロジェクトには hatch new --init で導入

https://hatch.pypa.io/latest/intro/#setup

Hatch「pyproject.toml 書いて」

  • 開発者が pyproject.toml を書く模様

  • hatch shellhatch runpyproject.toml の通りの仮想環境 でコマンドを実行できる(宣言的だ)

https://hatch.pypa.io/latest/environment/#dependencies

PDM

$ pdm --version
PDM, version 2.15.1

🔰本発表を気に触ったので、補足大歓迎!

インストール

$ curl -sSL https://pdm-project.org/install-pdm.py | python3 -

https://pdm-project.org/en/stable/#installation

導入

  • 新規作成:空ディレクトリで pdm new

  • 却下された PEP 582 をサポートしており、依存をインストールするディレクトリ __pypackages__ を作ることもできる

https://pdm-project.org/en/stable/usage/project/

PDM「仮想環境の管理は任せて!」

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

https://rye-up.com/guide/installation/

導入「Pythonも管理しときますね〜」

  • 新規作成:rye init

  • Ryeで管理してるプロジェクトは rye sync

https://rye-up.com/guide/basics/

開発者は 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番詳しくなるために 行動 するマインドセット

ご清聴ありがとうございました

巨人の肩に乗りまくっていきましょう!