Pythonのsource distributionとeggとwheel

wheelとeggの違いが分からないので調べた。

それぞれの作り方

source distribution

python setup.py sdist

egg

setup.pyにfrom distutils.core import setup ではなく from setuptools import setupと書かないと生成されない 。

python setup.py bdist_egg

wheel

python setup.py bdist_wheel

それぞれの特徴

source distribution

Pythonのsource distributionとはsetup.py、ライブラリのソース(.py etc)、README.rst、PKG-INFOが含まれるtar.gzであり、各プラットフォームでrecompileされる。

egg

eggとはbuilt distributionの一種であり、setup.pyを含まず、バイトコード や バイナリモジュールのための.so/.dll/.dylib、.exe (py2exeを使った場合) が含まれるzipファイルのようなものである。unzipコマンドで開ける。JavaのJARみたいな感じ。

unpackせずに、そのままimportでき、source distributionのようにrecompileする必要もない。ただし、.pycを含むのでPythonのversionごとに異なるeggファイルが必要となる。

egg_path='./test.egg'

sys.path.append(egg_path)

import test

wheel

wheelもbuilt distributionの一種であり、eggと置き換えようと開発されている。
これも基本的にはzipファイルであり、unzipコマンドで開ける。

インストール時にunpackが必要であり、eggのようにそのままimportはできない。

でも、wheelはバイトコードを含まず、インストール時に環境に応じたバイトコードが生成されるので、Pythonのversionが違ってもlibpythonにリンクしたバイナリモジュールを使わない限り、同一のwheelファイルを使える。eggのようにPythonのversionごとに異なるファイルを作る必要はなくて便利そう。

まとめ

PyPIに作ったライブラリを上げるときは、wheelを使うとよさそう。