Skip to content

Commit

Permalink
#3 Update slides for 2023
Browse files Browse the repository at this point in the history
  • Loading branch information
astropenguin committed Jul 10, 2023
1 parent 0f690d5 commit db85c56
Showing 1 changed file with 100 additions and 94 deletions.
194 changes: 100 additions & 94 deletions slides.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,21 @@ backgroundImage: url('https://marp.app/assets/hero-background.jpg')

![bg right:30% 75%](https://openastronomy.org/pyastro/images/pyastro_logo_150px.png)

- 2020-06-17 / Python tutorials
- Presented by Akio Taniguchi (PD)
Akio Taniguchi / 2023-07-11

---

### Preparation

当日までに、以下の準備と理解をお願いします。

- [Homebrew](https://brew.sh)によるPythonのインストール
- `$ brew install python`
- 手元(ローカル)のマシンでのPython 3の用意
- 最新のmacOSであればデフォルトで入っているはず
- なければ[Homebrew](https://brew.sh)で導入→`brew install python`
- Bash(zsh)の最低限のコマンドの理解
- `cd`, `mv`, `rm`, `mkdir`, `ls`あたりが使えればOKです
- Bash(zsh)の環境変数`PATH`の理解
- いわゆる「パスを通す」とは何かが分かればOKです
- 参考:[PATHを通すとは? (Mac OS X) - Qiita](https://qiita.com/soarflat/items/09be6ab9cd91d366bf71)
- いわゆる「[パスを通す](https://qiita.com/soarflat/items/09be6ab9cd91d366bf71)」とは何かが分かればOKです

---

Expand Down Expand Up @@ -65,25 +64,26 @@ backgroundImage: url('https://marp.app/assets/hero-background.jpg')

---

### Pythonのディレクトリ構造

これらのインストール先は以下のように確認できる
### Pythonのディレクトリ構造(macOS Ventura)

```shell
$ which python3
/usr/local/bin/python3
/usr/bin/python3
```

```shell
$ which pip3
/usr/local/bin/pip3
/usr/bin/pip3
```

```shell
$ python3 -m site
sys.path = [
'/usr/local/Cellar/python',
'/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python37.zip',
'/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7',
'/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload',
'/usr/local/lib/python3.7/site-packages',
'/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages',
'/Users/<user name>',
'/Library/Developer/CommandLineTools/.../3.9/lib/python39.zip',
'/Library/Developer/CommandLineTools/.../3.9/lib/python3.9',
'/Library/Developer/CommandLineTools/.../3.9/lib/python3.9/lib-dynload',
'/Library/Developer/CommandLineTools/.../3.9/lib/python3.9/site-packages',
]
```

Expand Down Expand Up @@ -156,18 +156,18 @@ $ ls -a

`.venv`には実行プログラム(のリンク)とsite-packagesが存在する

```
```shell
$ tree -L 3 .venv
.venv
├── bin # ipython, jupyterなどもここに保存される
│ ├── activate # 仮想環境の有効化のためのコマンド
│ ├── pip
│ ├── pip3
│ ├── python -> python3 # シンボリックリンク
│ └── python3 -> /usr/local/bin/python3 # シンボリックリンク
│ └── python3 -> /Library/Developer/.../python3 # シンボリックリンク
├── include
├── lib
│ └── python3.7 # 標準ライブラリはコピーされない
│ └── python3.9 # 標準ライブラリはコピーされない
│ └── site-packages
└── pyvenv.cfg
```
Expand Down Expand Up @@ -206,9 +206,9 @@ $ source .venv/bin/activate
(.venv) $ pip list
Package Version
---------- -------
numpy 1.18.5
pip 20.1.1
setuptools 41.2.0
numpy 1.25.1
pip 23.1.2
setuptools 58.0.4
```

- 仮想環境の無効化
Expand All @@ -235,132 +235,138 @@ setuptools 41.2.0
### ツールを使ったPythonの環境構築|概要

- 代表的なツール
- [Pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja):PyPA(Python Packaging Authority)が開発しているツール。2017年頃登場。2020年6月現在最も知名度の高いツールで、日本語の情報も多い。データ解析・制御向け(後述)。
- [Pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja):PyPA(Python Packaging Authority)が開発しているツール。2017年頃登場。データ解析・制御向け(後述)。
- [Poetry](https://python-poetry.org/):Sébastien Eustaceらコミュニティによって開発されているツール。2018年頃登場。パッケージ開発向け(後述)。
- [ベストプラクティス?](https://qiita.com/sk217/items/43c994640f4843a18dbe)
- 2020年6月現在、様々なツールが乱立している状態のため、標準的な方法は存在しない。が、上記の2つなら大丈夫だろう。
- ベストプラクティス?
- 2023年現在、唯一の方法と言えるものはない。何をやりたいかで使い分けよう。迷ったら上記2つから選ぶのが良いだろう。(ただし、A研としては使用実績からPoetryを推奨)

---

### ツールを使ったPythonの環境構築|概要

- ツールごとの違い
- Pipenv:プロジェクトに必要な環境変数を`.env`ファイルに定義しておくと自動的に読み込んでくれる。例えば、ローカルに保存されたデータのディレクトリ名を環境変数で定義することで、ディレクトリ名をスクリプトに直書きせずに開発できる
- Poetry:Pythonパッケージの公開に必要な諸々のファイル(setup.py, MANIFEST.in)などを、設定ファイルの情報から自動生成してくれる。PyPI(Python Package Index)への登録もコマンド一つで完結する。
- [Pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja):プロジェクトに必要な環境変数を`.env`ファイルに定義しておくと自動的に読み込んでくれる。これにより、ユーザごとに異なる情報(例:ユーザ名)や共有すべきでない情報(例:パスワード・APIキー)など直書きせずに開発できる
- [Poetry](https://python-poetry.org/):Pythonパッケージの公開に必要な諸々のファイル(`setup.py`, `MANIFEST.in`, ...)を、設定ファイル(`pyproject.toml`)の情報から自動生成してくれる。PyPI(Python Package Index)への登録もコマンド一つで完結する。

---

### ツールを使ったPythonの環境構築|Pipenv
### Poetryを使ったPythonの環境構築|ツールの導入

PipenvのインストールはHomebrewで行える
Poetryのインストールはコマンドラインで行う

```shell
$ brew install pipenv
$ curl -sSL https://install.python-poetry.org | python3 -
$ brew install poetry # "This build of python ... symlinks"に遭遇したらこっちを試す
```

Pipenvが仮想環境をプロジェクト配下に作成するよう設定
Poetryが仮想環境をプロジェクト配下に作成するように設定しておくと分かりやすい(デフォルトでは全く別の場所に作られる)

```shell
$ # bashの場合
$ echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bash_profile
$ source ~/.bash_profile

$ # zshの場合
$ echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.zprofile
$ source ~/.zprofile
$ poetry config virtualenvs.create true
```

---

### ツールを使ったPythonの環境構築|Pipenv

- 設定ファイル
- Pipfile:プロジェクトに必要なPythonのバージョンと外部ライブラリのバージョンの**条件**を記述する。例えば`numpy>=1.18`など。
- Pipfile.lock:Pipenvによってインストールされた外部ライブラリの**実際の**バージョンの情報が保存される(自動生成される)。
### Poetryを使ったPythonの環境構築|初期設定

[a-lab-nagoya/python-tutorials](https://github.com/a-lab-nagoya/python-tutorials)の設定を使って試してみよう
プロジェクト(環境構築したいディレクトリ)を作成し、移動後`poetry init`で初期設定を行う。`pyproject.toml`が生成される

```shell
$ git clone https://github.com/a-lab-nagoya/python-tutorials.git
$ cd python-tutorial
$ mkdir /path/to/project
$ cd /path/to/project
$ poetry init
Package name [project]: <プロジェクト名>
Version [0.1.0]: <バージョン>
Description []: <プロジェクトの説明>
Author [<開発者名>, n to skip]:
License []: <ライセンスの種類>
Compatible Python versions [^3.11]: <プロジェクトがサポートするPythonのバージョン(後述)>
Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Do you confirm generation? (yes/no) [yes] yes
```

---

### ツールを使ったPythonの環境構築|Pipenv

`pipenv install`で設定ファイル(Pipfile.lock)に保存された通りの情報で仮想環境を作成し、外部ライブラリをインストールする。
### Poetryを使ったPythonの環境構築|初期設定

```shell
$ pipenv install --dev
$ cat pyproject.toml
[tool.poetry]
name = "project"
version = "0.1.0"
description = ""
authors = ["<開発者名>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```

`pipenv run <command>`で、仮想環境に出入りすることなく、仮想環境下のコマンドを実行することができる。例えば以下の通り。
---

### Poetryを使ったPythonの環境構築|初期設定

`poetry add`で外部ライブラリのインストールを行う。仮想環境も同時に生成される。インストールが終わると`poetry.lock`が生成される。

```shell
$ pipenv run jupyter lab
$ poetry add numpy matplotlib
Creating virtualenv project in /path/to/project/.venv
Using version ^3.7.2 for matplotlib
Using version ^1.25.1 for numpy
...
Package operations: 11 installs, 0 updates, 0 removals
• Installing numpy (1.25.1)
• Installing matplotlib (3.7.2)
... # numpy, matplotlib以外の必要パッケージもインストールされる
Writing lock file
```

---

### ツールを使ったPythonの環境構築|Poetry
### Poetryを使ったPythonの環境構築|コマンド実行

PoetryのインストールはHomebrewで行える
`poetry run`で仮想環境に「入った」状態でコマンドを実行ができる

```shell
$ brew install poetry
$ poetry run python /path/to/script.py # 仮想環境のPython 3で実行される
$ # コマンドの実行が終わると仮想環境の外に自動的に出る
```

Poetryが仮想環境をプロジェクト配下に作成するよう設定
`poetry shell`で仮想環境に入ったままの状態にもできる

```shell
$ # bashの場合
$ echo "export POETRY_VIRTUALENVS_IN_PROJECT=true" >> ~/.bash_profile
$ source ~/.bash_profile

$ # zshの場合
$ echo "export POETRY_VIRTUALENVS_IN_PROJECT=true" >> ~/.zprofile
$ source ~/.zprofile
$ poetry shell
(project-py3.11) $ python # 仮想環境のPython 3が起動する
(project-py3.11) $ deactivate # venvと同様にdeactivateで抜ける
$
```

---

### ツールを使ったPythonの環境構築|Poetry

- 設定ファイル
- pyproject.toml:プロジェクトに必要なPythonのバージョンと外部ライブラリのバージョンの**条件**を記述する。例えば`numpy>=1.18`など。
- poetry.lock:Pipenvによってインストールされた外部ライブラリの**実際の**バージョンの情報が保存される(自動生成される)。
### Poetryを使ったPythonの環境構築|設定ファイル

[a-lab-nagoya/python-tutorials](https://github.com/a-lab-nagoya/python-tutorials)の設定を使って試してみよう。

```shell
$ git clone https://github.com/a-lab-nagoya/python-tutorials.git
$ cd python-tutorial
```
- **pyproject.toml:** プロジェクトに必要なPythonのバージョンと外部ライブラリのバージョンの**条件**を記述する。`poetry add`で自動記述されるが、条件を変えたい場合は自分で編集することになる。`poetry add numpy==1.20`のように追加時に指定することも可能。
- **poetry.lock:** Poetryによって仮想環境にインストールされた外部ライブラリの**実際の**バージョンの情報が保存される。`poetry update``pyproject.toml`に書かれた条件に従って仮想環境を都度更新できる。基本的にこのファイルはユーザが編集してはならない。

---

### ツールを使ったPythonの環境構築|Poetry
### Poetryを使ったPythonの環境構築|バージョン指定

`poetry install`で設定ファイル(poetry.lock)に保存された通りの情報で仮想環境を作成し、外部ライブラリをインストールする。

```shell
$ poetry install
```

`poetry run <command>`で、仮想環境に出入りすることなく、仮想環境下のコマンドを実行することができる。例えば以下の通り。

```shell
$ poetry run jupyter lab
```
| 表記(例) | 条件 |
| :--- | :--- |
| `python = ">=3.8, <3.12"` | 3.8以上かつ3.12未満のPythonのみ許容(`,`はAND) |
| `numpy = "^1.20"` | 1.20以上、2.0未満のnumpyのみ許容(メジャーバージョンを上げてはいけない) |
| `pandas = "^1.5 \| ^2.0"` | 1.5以上かつ2.0未満、または2.0以上かつ3.0未満のみ許容(`\|`はOR) |

---

### 参考文献
### ツールを使ったPythonの環境構築|開発の流れ

- [2020 年の Python パッケージ管理ベストプラクティス - Qiita](https://qiita.com/sk217/items/43c994640f4843a18dbe)
- [Pipenv: 人間のためのPython開発ワークフロー](https://pipenv-ja.readthedocs.io/ja/translate-ja/)
- [Poetry - Python dependency management and packaging made easy.](https://python-poetry.org/)
- [Python Packaging Authority — PyPA documentation](https://www.pypa.io/en/latest/)
- [a-lab-nagoya/python-tutorials: Python tutorials based on chainer/tutorials (https://tutorials.chainer.org)](https://github.com/a-lab-nagoya/python-tutorials)
- [PATHを通すとは? (Mac OS X) - Qiita](https://qiita.com/soarflat/items/09be6ab9cd91d366bf71)
- **環境作成・保存:** `poetry init`, `poetry add`で設定ファイル(`pyproject.toml`, `poetry.lock`)を一から作成。これらをGitHub等のクラウドで管理しておくことで、開発環境を「保存」する。
- **環境復元:** 設定ファイルを新しいマシンにコピーし、シングルコマンド(`poetry install`)でコピー元と同一の環境を「復元」する。
- **環境更新:** `pyproject.toml`を編集してPythonや外部ライブラリの条件を更新し、`poetry update`で実際にインストールされたものも更新することで、開発環境を「更新」する。

0 comments on commit db85c56

Please sign in to comment.