在setup.py中对install_requires进行“或......或......”区分

时间:2018-03-11 17:15:57

标签: python setup.py

如果设计setup.py并且有些要求可以通过两个不同的模块来实现,即只需要安装两个模块中的一个,我该如何在install_requires行中表达? 例如。 setup.py看起来像这样:

setup(
    name='my_module',
    version='0.1.2',
    url='...',

    ...,

    install_requires=['numpy', 'tensorflow']
)

执行pip install my_module时,即使安装了 tensorflow-gpu ,也会安装 tensorflow (CPU)(这也符合要求) ,但不是,因为它的名称不同。)

我可以这样做:

    install_requires=['numpy', 'tensorflow' or 'tensorflow-gpu']

2 个答案:

答案 0 :(得分:2)

您的设置功能需要extras_require

extras_require = {
    'gpu':  ['tensorflow-gpu'],
    'cpu': ['tensorflow']
},

然后可以安装:

pip install your_package[gpu]pip install your_package[cpu]

Source

答案 1 :(得分:2)

setup.py只是另一个python脚本,所以你可以在其中放入任何逻辑来确定正确的设置args。例如,您可以检查是否安装了tensorflowtensorflow_gpu,并动态修改安装代码列表:

from pkg_resources import DistributionNotFound, get_distribution
from setuptools import setup


def get_dist(pkgname):
    try:
        return get_distribution(pkgname)
    except DistributionNotFound:
        return None


install_deps = []

if get_dist('tensorflow') is None and get_dist('tensorflow_gpu') is None:
    install_deps.append('tensorflow')


setup(
    ...
    install_requires=install_deps,
)

但是,请注意,一旦您开始在设置脚本中放置代码,以便在安装时执行任何操作,您就不能再分发轮子,因为轮子不会发送setup.py,而是在 build 时执行一次。源分发将很好地服务:

$ python setup.py sdist
running sdist
running egg_info
...
creating dist
Creating tar archive
removing 'mypkg-0.0.0' (and everything under it)

如果未安装,则安装生成的源tar会提取tensorflow

$ pip install dist/mypkg-0.0.0.tar.gz
Processing ./dist/mypkg-0.0.0.tar.gz
Collecting tensorflow (from mypkg==0.0.0)
...
Installing collected packages: tensorflow, mypkg
Successfully installed mypkg-0.0.0 tensorflow-1.6.0