setup.pyにinstall_requiresを書いたけどpipで処理されないとき(versionが原因)
Pocket

ちょっとしたツールをPythonで作ったので、pipインストールできるように以下のようにsetup.pyを書いてたのだけど、どうもinstall_requiresが処理されないということがあった。

■ setup.py

import os
import platform

import setuptools
from hoge import __version__

if __name__ == "__main__":
    setuptools.setup(
        name='hoge',
        version=__version__,
        install_requires=[
            'fuga',
            'fugafuga'
        ],
        packages=setuptools.find_packages(),
        py_modules=['hoge'],
        entry_points={
            'console_scripts': [
                'hoge = hoge:main',
            ],
        },
        data_files=get_data_files(),
    )

 

結論から言うと、原因は__version__を本体側から取ってきてたのが原因だった。

 

Sponsored Links

どうやら、setupが実行される前にパッケージを参照してしまっているため、正常にsetupの処理が行われないことが原因らしい。
Versionを本体側に書いておいてそれを参照させることで編集箇所を1箇所にまとめたいという理由でこういう書き方をしていたのだけど、この書き方だとまずいらしい。

じゃあどう書けばいいかというと、setup.py側に固定でバージョンを記述して、本体側でそれを参照させれば良さそうだ。

■ setup.py

import os
import platform

import setuptools


if __name__ == "__main__":
    setuptools.setup(
        name='hoge',
        version='0.1.1',
        install_requires=[
            'fuga',
            'fugafuga'
        ],
        packages=setuptools.find_packages(),
        py_modules=['hoge'],
        entry_points={
            'console_scripts': [
                'hoge = hoge:main',
            ],
        },
    )

 

■ 本体側(__init__.py)

from pkg_resources import get_distribution

# version
__version__ = get_distribution('パッケージ名').version

 

これで、Version情報を1箇所にまとめて記述して、かつpipでのインストールが正常に行われるようになった。

 

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*