ちょっとしたツールを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__ を本体側から取ってきてたのが原因だった。

python - Dependencies are not installed by pip - Stack Overflow

That is because you are referring your package before setup has been executed.

Pip need to first touch setup(...) to do everything. But before it, you from mylib import version. So setup doesn't execute at all.

どうやら、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)はこんな感じ。

__init__.py
from pkg_resources import get_distribution # version __version__ = get_distribution('パッケージ名').version

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