Google Colabは、簡易的に用意できるLinux環境でもあるため、環境構築の手順・手法の記録・整理にも有用です。本記事では、Pythonのライブラリ・パッケージ管理に用いる、Poetryの基本的な使い方を紹介します。
すぐに使えるチートシートはこちら Google Colab版
すぐに実行して、試せるコードレシピはこちら。
準備: 作業フォルダを作る
まず、今回作業する専用のフォルダを作っておきます。Colabは一時的なLinux環境なので、フォルダを分けておくと、あとの手順で迷いにくくなります。
まずはpoetryのインストール
!mkdir -p /content/poetry_demo
%cd /content/poetry_demo
!pip install poetry -q
下記コマンドで、poetryのバージョンが出れば、成功です、
!poetry --version
(表示されるバージョン番号は、実行するタイミングによって変わります。)
2. 失敗例: プロジェクトを作らずに poetry add する
Poetryは、ライブラリの管理を pyproject.toml というファイルで行います。このファイルがないまま、いきなりライブラリを追加しようとするとどうなるか試します。
!poetry add requests
実行結果です。
Poetry could not find a pyproject.toml file in /content/poetry_demo or its parents
pyproject.toml が無いので、「どのプロジェクトに追加すればいいのか分からない」というエラーです。
先に、プロジェクトの初期化が必要です。
!poetry init -n
-n は、対話質問をスキップして、デフォルト値でさっさと作るオプションです。実行しても画面には何も表示されませんが、これで成功です。
pyproject.toml の中身を見てみます。
!cat pyproject.toml
次のような内容が生成されています(値の一部は環境によって変わります)。
[project]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = [
{name = "Your Name",email = "you@example.com"}
]
requires-python = ">=3.10"
dependencies = [
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
dependencies = [] の部分に、これから追加するライブラリが記録されていきます。
3. 失敗例: このまま poetry install すると、別のエラーになる
pyproject.toml ができたので、これで大丈夫かと思いきや、このまま poetry install を実行すると、実はもうひとつ別のエラーに当たります。
!poetry install
実行結果です。
Installing dependencies from lock file
No dependencies to install or update
Installing the current project: poetry-demo (0.1.0)
Error: The current project could not be installed: No file/folder found for package poetry-demo
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
Poetryは本来、「自分のプロジェクト自体を、配布可能なパッケージとしてインストールする」ことも面倒を見てくれるツールです。しかし今回のように、Colab上でスクリプトを動かしたいだけの場合、poetry-demo という名前のパッケージ本体(ソースコードのフォルダ)が存在しないため、このエラーになります。
エラーメッセージにも出ているとおり、パッケージ化が不要な場合は package-mode = false を設定します。
%%writefile pyproject.toml
[project]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = [
{name = "Your Name",email = "you@example.com"}
]
requires-python = ">=3.10"
dependencies = [
]
[tool.poetry]
package-mode = false
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
!poetry install
今度は、次のようにエラーなく終わります。
Installing dependencies from lock file
No dependencies to install or update
package-mode = false は、「Poetryはライブラリ管理だけに使い、自分のコードをパッケージとして配布はしない」という宣言です。
Colab上でちょっとした検証をする用途では、最初から設定しておくと、この種のエラーを避けられます。
4. 失敗例: ライブラリを追加していないのにimportする
これから使うスクリプトを用意します。pyfiglet という、文字をアスキーアートにするライブラリを使ってみます。
%%writefile hello.py
import pyfiglet
print(pyfiglet.figlet_format("Poetry"))
まだ pyfiglet を追加していない状態で、実行してみます。
!poetry run python3 hello.py
実行結果です。
ModuleNotFoundError: No module named 'pyfiglet'
当然ですが、まだ追加していないライブラリは使えません。poetry add で追加します。
!poetry add pyfiglet
実行結果の例です。
Using version ^1.0.4 for pyfiglet
Updating dependencies
Resolving dependencies...
Package operations: 1 install, 0 updates, 0 removals
- Installing pyfiglet (1.0.4)
Writing lock file
これで、pyproject.toml の dependencies に pyfiglet が追加され、実際にインストールもされました。
5. 失敗例: poetry add したのに、ふつうの python では使えない
ここが今回いちばん体感してほしいポイントです。ライブラリを追加したので、hello.py を実行してみます。ただし、あえて poetry run を付けずに、ふつうの python3 で実行します。
!python3 hello.py
実行結果です。
ModuleNotFoundError: No module named 'pyfiglet'
poetry add したはずなのに、また同じエラーになりました。
これは、Poetryがライブラリを、プロジェクト専用の独立した仮想環境にインストールしているためです。Colab全体の環境(ふつうに !pip install したときの置き場所)とは、別の場所に置かれています。
poetry run を付けて実行すると、この専用の仮想環境の中でコマンドが実行されます。
!poetry run python3 hello.py
今度はきちんと動きます。
____ _
| _ \ ___ ___| |_ _ __ _ _
| |_) / _ \ / _ \ __| '__| | | |
| __/ (_) | __/ |_| | | |_| |
|_| \___/ \___|\__|_| \__, |
|___/
つまり、
poetry add pyfiglet
→ 「専用の仮想環境」にだけ pyfiglet が入る
python3 hello.py
→ Colab全体の環境で実行される(pyfiglet はここには無い)
poetry run python3 hello.py
→ 「専用の仮想環境」で実行される(pyfiglet がある)
「入れたのに使えない」と思ったときは、まず poetry run を付け忘れていないか確認する、というのが定番のチェックポイントです。
6. 失敗例: poetry remove すると、また使えなくなる
今度は、動いている状態から pyfiglet を取り除いてみます。
!poetry remove pyfiglet
実行結果の例です。
Updating dependencies
Resolving dependencies...
Package operations: 0 installs, 0 updates, 1 removal
- Removing pyfiglet (1.0.4)
Writing lock file
この状態で、もう一度実行します。
!poetry run python3 hello.py
実行結果です。
ModuleNotFoundError: No module named 'pyfiglet'
poetry run を付けていても、poetry remove した以上、専用の仮想環境からは消えているので、当然使えなくなります。「入れると使える、消すと使えなくなる」が、そのままコマンドの結果として現れます。
7. 失敗例: 設定ファイルだけ書き換えて、手順を1つ飛ばす
最後に、チーム開発でありがちな失敗を再現します。誰かが poetry add を使わずに、pyproject.toml を直接書き換えて、ライブラリを追記した場面を想定します。
%%writefile pyproject.toml
[project]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = [
{name = "Your Name",email = "you@example.com"}
]
requires-python = ">=3.10"
dependencies = [
"pyfiglet (>=1.0.4,<2.0.0)"
]
[tool.poetry]
package-mode = false
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
dependencies に pyfiglet を直接書き足しました。この状態で poetry install を実行してみます。
!poetry install
実行結果です。
Installing dependencies from lock file
pyproject.toml changed significantly since poetry.lock was last generated. Run `poetry lock` to fix the lock file.
pyproject.toml を手で書き換えただけでは、poetry.lock(実際にインストールするバージョンを固定しているファイル)が更新されません。Poetryは、この2つのファイルの内容が食い違っていることに気づき、インストールを止めます。
poetry lock を実行して、食い違いを解消します。
!poetry lock
!poetry install
実行結果です。
Resolving dependencies...
Writing lock file
Installing dependencies from lock file
Package operations: 1 install, 0 updates, 0 removals
- Installing pyfiglet (1.0.4)
これで、pyproject.toml と poetry.lock の内容が揃い、無事にインストールできました。実行して確認します。
!poetry run python3 hello.py
____ _
| _ \ ___ ___| |_ _ __ _ _
| |_) / _ \ / _ \ __| '__| | | |
| __/ (_) | __/ |_| | | |_| |
|_| \___/ \___|\__|_| \__, |
|___/
pyproject.toml を直接編集しただけでは反映されず、poetry lock → poetry install という手順を踏んで、初めて実際の環境に反映される。この一手間は面倒に見えますが、「設定ファイルの内容」と「実際にインストールされているもの」を、常に一致させておくための仕組みです。
8. まとめ
Google Colabは、失敗しても簡単に環境を作り直せる、使い捨てのLinux環境でもあります。エラーを避けるだけでなく、あえて失敗させて原因を確認したり、修正後の動作まで試せることも、Colabを使って環境構築を学ぶメリットだと考えられます。
Poetryの手順は、最初は少し面倒に感じるかもしれません。しかし、仮想環境・設定ファイル・ロックファイルを明確に分けて管理することで、「自分の環境では動いたのに、ほかの環境では動かない」という問題を減らしてくれます。
弊社について
本記事を書いている 合同会社インクルーシブソリューションズ は、データ基盤構築・分析基盤設計・システム改善支援を中心に活動している小規模IT法人です。
主な領域は、
- データマート設計・データパイプライン構築
- SQL / Python を用いたデータ処理設計
- BI導入支援・分析基盤の整備
- 既存システムの運用改善・可視化支援
といった、「データを使える状態にする」ための活動です。
弊社の企業活動に興味がある方は、ぜひ公式サイトも覗いてみてください。