1. ホーム
  2. python

setup.py とパッケージのバージョンを共有する正しい方法は何ですか?

2023-11-21 09:55:02

質問

distutils , setuptools など。パッケージのバージョンは setup.py :

# file: setup.py
...
setup(
name='foobar',
version='1.0.0',
# other attributes
)

パッケージ内から同じバージョン番号にアクセスできるようにしたいのですが。

>>> import foobar
>>> foobar.__version__
'1.0.0'


私は __version__ = '1.0.0' を私のパッケージの __init__.py に追加することもできますが、パッケージへの簡略化されたインタフェースを作成するために、私のパッケージに追加のインポートを含めたいと思います。

# file: __init__.py

from foobar import foo
from foobar.bar import Bar

__version__ = '1.0.0'

# file: setup.py

from foobar import __version__
...
setup(
name='foobar',
version=__version__,
# other attributes
)

しかし、これらの追加インポートにより、インストール時に foobar のインストールに失敗する可能性があります。setup.pyとパッケージのバージョンを共有する正しい方法は何でしょうか?

どのように解決するのですか?

バージョンを setup.py だけで、自分のバージョンを読むには pkg_resources で、事実上 setuptools メタデータを問い合わせることになります。

ファイルを作成します。 setup.py

setup(
    name='foobar',
    version='1.0.0',
    # other attributes
)

ファイルを作成します。 __init__.py

from pkg_resources import get_distribution

__version__ = get_distribution('foobar').version

これをインストールせずに実行することになるすべてのケースで動作させるために、以下のようにテストしてください。 DistributionNotFound と配布場所をテストします。

from pkg_resources import get_distribution, DistributionNotFound
import os.path

try:
    _dist = get_distribution('foobar')
    # Normalize case for Windows systems
    dist_loc = os.path.normcase(_dist.location)
    here = os.path.normcase(__file__)
    if not here.startswith(os.path.join(dist_loc, 'foobar')):
        # not installed, but there is another version that *is*
        raise DistributionNotFound
except DistributionNotFound:
    __version__ = 'Please install this project with setup.py'
else:
    __version__ = _dist.version