2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Colabで解剖する環境構築 ①Poetry編

2
Posted at

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.tomldependenciespyfiglet が追加され、実際にインストールもされました。

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"

dependenciespyfiglet を直接書き足しました。この状態で 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.tomlpoetry.lock の内容が揃い、無事にインストールできました。実行して確認します。

!poetry run python3 hello.py
 ____            _
|  _ \ ___   ___| |_ _ __ _   _
| |_) / _ \ / _ \ __| '__| | | |
|  __/ (_) |  __/ |_| |  | |_| |
|_|   \___/ \___|\__|_|   \__, |
                          |___/

pyproject.toml を直接編集しただけでは反映されず、poetry lockpoetry install という手順を踏んで、初めて実際の環境に反映される。この一手間は面倒に見えますが、「設定ファイルの内容」と「実際にインストールされているもの」を、常に一致させておくための仕組みです。

8. まとめ

Google Colabは、失敗しても簡単に環境を作り直せる、使い捨てのLinux環境でもあります。エラーを避けるだけでなく、あえて失敗させて原因を確認したり、修正後の動作まで試せることも、Colabを使って環境構築を学ぶメリットだと考えられます。

Poetryの手順は、最初は少し面倒に感じるかもしれません。しかし、仮想環境・設定ファイル・ロックファイルを明確に分けて管理することで、「自分の環境では動いたのに、ほかの環境では動かない」という問題を減らしてくれます。

弊社について

本記事を書いている 合同会社インクルーシブソリューションズ は、データ基盤構築・分析基盤設計・システム改善支援を中心に活動している小規模IT法人です。

主な領域は、

  • データマート設計・データパイプライン構築
  • SQL / Python を用いたデータ処理設計
  • BI導入支援・分析基盤の整備
  • 既存システムの運用改善・可視化支援

といった、「データを使える状態にする」ための活動です。

弊社の企業活動に興味がある方は、ぜひ公式サイトも覗いてみてください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?