サードパーティ製ライブラリのインストールを楽にするWheelとは?

こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。

Pythonにはpathlibやdatetimeなどの標準ライブラリがいくつか入っているため、インストールするだけである程度のことができるようになっています。

ただ、Pythonは幅広い用途で使われていることもあって、必要とされるすべての機能を含めてしまうと容量が大きなものになってしまいますし、不要なものが中には出てきてしまいますので、標準ライブラリに含まれていない機能というものは色々あります。

そのため、より専門的なこと、高度なことをしたいと思うのなら、サードパーティ製ライブラリを利用することになりますが、利用するにはインストールが必要です。今回は、このインストールの時に利用される便利なWheelについてお話したいと思います。

Pythonとサードパーティ製ライブラリ

Pythonでデータ分析や機械学習、画像解析など、より専門的なことをしたいと思えば、pandasやNumPy、JupyterLab、Pillow(画像変換ツール)、Streamlitなどの多様なサードパーティ製ライブラリを使用することになります。

また、Pythonはデータ分析以外でもWebの世界でもよく利用されます。例えばDjangoやFlask、FastAPIなどのさまざまなフレームワークがあり、以前紹介したStreamlitやGradioなどのWeb作成を手伝ってくれるようなものもあります。

こうしたサードパーティ製ライブラリが充実しているおかげで様々な用途で物を作りやすいため、Pythonが活用されるシーンが増えていると考えています。

ちなみに、当協会で実施している、基礎試験や実践試験においては、サードパーティ製ライブラリに関する問題はほとんど出題されません。もちろん、インストール方法やフォーマッターについては実践試験で多少出題されますが、使い方や具体的なコーディング方法は試験ではほとんど問いません。

一方で、データ分析試験や今年開始する予定のデータ分析実践試験においては、データ分析が中心になっているため、サードパーティ製ライブラリが使われることを前提に試験が作られています。

サードパーティ製ライブラリの正体

ところで、そもそもサードパーティ製ライブラリの実体は何で出来ているのでしょうか。

サードパーティ製ライブラリはPythonのソースコードの塊で出来ているのが基本で、pipでインストールできる形にパッケージング化されています。そのため、サードパーティ製ライブラリを作ろうと思うなら、パッケージングの方法を学ばなければなりませんが、パッケージング化ができるようになれば他の環境でも利用できるようにすることができます。

パッケージにする最低条件は、ソースコードを固めたzipやtazが基本です。ただ、Pythonだけで構成されていないパッケージも世の中にはたくさんあります。

例えばNumPyは、Pythonだけでなく、内部にC拡張と言われる、C言語で書かれたものが入っています。また、scikit-learnなどで使われるSciPyはC拡張だけでなく、Fortranで書かれている部分があり、いろいろなものが組み合わさって作られているものもあります。

本来、C拡張で出来たものをインストールするには、ソースコードを取ってきて、何かしらの手段でC拡張したものを使えるようにコンパイルする必要があります。C拡張になっているものの多くは、基本的にOS依存になることが多くあり、Windows用、Mac用、Linux用などそれぞれに適した形にコンパイルしてあげる必要があります。これを「ビルド」と言います。

適切にコンパイルするにはC言語をコンパイルできるビルド環境が必要です。例えば、NumPyをそのままインストールしようとすると、C拡張のコンパイラが入っているか?とOSに表示され、入っていない場合にはコンパイルできないというエラーが出ます。

ただ、各OSにそれぞれのビルド環境を整えるのは非常に面倒です。それなのになぜPythonではなく、C言語などの他の言語で書かれている部分があるかと言えば、主に実行速度を速めるために使われています。

こういった面倒を回避して、インストールを楽にしようという動きは昔からずっと続いてきました。どうすれば配布しやすくなるのか、歴史的にもいろいろな変遷をたどり、試行錯誤されてきましたが、現在は環境ごとにビルドした状態でパッケージ化し、それをWheel(拡張子:whl)という標準規格として提供するという形に落ち着いています。

Wheelの正体

では、Wheelはどのように提供されているのでしょうか。

Wheelは各サードパーティ製ライブラリを作った人が、ルールにのっとった決まった名称をファイルにつけ、PyPIにアップロードします。ユーザーは[pip install パッケージ名]と打つだけで、PyPIから自身の環境に適したWheelが自動的に選ばれてインストールが実行されます。

<Wheelの命名規則>

{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl.]

ファイル名を見れば、どの環境に適したものかわかるようになっています。

ではここで、例として、NumPyのページを見てみましょう。

https://pypi.org/project/numpy/#files

このページのBuilt Distributions以下にWheelがアップされています。

ここではCPython(PSFが提供しているもの)を利用していることを前提として話しますが、NumPy 2.0.0の場合は、CPythonの3.9、3.10、3.11、3.12用のWheelが用意されていることが分かります。

NumPyの場合は、CPythonの内部のC拡張のAPIがバージョンごとに少しずつ違う場合があるため、すべてそれぞれのPythonのバージョンごとにビルドしなければなりません。

そのため、ここにないバージョンは、Wheelが用意されていないため、自分で作るか、誰かが他のサイトで提供しているものを持ってくるしかありません。

一方、StreamlitはWheelがひとつしかありません。

https://pypi.org/project/streamlit/#files

これはビルドが必要ないと思って間違いありません。Pythonの環境・バージョンも、OSのバージョンも、CPUのバージョン・種類も、特に気にしなくていいようにWheelを作ってくれています。

C拡張が必要ないので、Source Distributionの方からインストールしても、ビルド環境は必要ありませんが、Wheelを使うとインストールが速くなります。

メジャーなサードパーティ製ライブラリにおいてはC拡張がないものであってもWheelが置いてあることがほとんどです。が、Wheelは必須ではありませんので、上がっていたら喜びましょう。

Wheelができる10年ほど前は環境を作るのは本当に大変でした。Wheelという存在のおかげでユーザー側は非常に便利に使えるようになりましたので、本当に作ってくれる人には感謝です。

ところで、たまにWheelで困ることがあります。

Pythonのバージョンが上がっていきますので、サードパーティ製ライブラリもたまにバージョンが上がります。ただ、中にはバージョンがあまり上がらないものや、メンテナンスが止まっているものがあります。

そうなるとPythonのバージョンが上がっても、Wheelがアップされないということもでてきます。

そんな中で、どうしても新しいバージョンのPythonを使いたいとなれば、自分で環境を作るか、何かしらの工夫をしなくてはならなくなります。

多くのパッケージであれば、Pythonの新バージョン公開後、数か月以内に新しいバージョンが公開されます。

そのため、もし公開されてすぐの新しいバージョンのPythonで開発したいとなれば、周辺のライブラリが対応していない状態になりますので、自身で環境を作らなければならないわけですが、環境を作るのはとても難しいため、強引に新しいPythonを使うことで開発コストが上がってしまう結果になります。

私自身は、特に新しいバージョンのPythonをすぐに使う必要はないと考えていますので、わざわざ飛び込むことはしません。

逆に、古いバージョンでも同じだと言えます。すでにEOLが間近なPython 3.8であえて続けるという選択もしません。

自由度が低い環境で試すより、venvで仮想環境を作ってみよう

ところで、中にはGoogle Colaboratoryのようなサービスを利用している人もいると思いますが、Colaboratoryは現在、Python 3.10.12がインストールされています(2024年7月時点)。

そのため、Colaboratoryを使いたいとなると、バージョンはこれ以外のものを利用できませんので、ライブラリがPython3.10に対応している必要があります。

そして、自由度がないため、自身が使いたいライブラリを追加インストールしたり、アップデートしたりすると、上手くバージョンの整合性が合わないという困ったことが起きることもあります。

なので、ちょっと試したい、誰かの作ったものを見る、並行で開発したいということなら、venvという仮想環境を自身のPCに作ることをおすすめします。venvによって複数の仮想環境を都度作れますので、まっさらな環境から始めることができ、整合性が合わないというようなことに悩まされることにもなりませんし、処理も簡単です。

PAGE TOP