"either... or... "区分 setup.py 中的install_requires



如果设计一个 setup.py 并且有一些要求可以通过两个不同的模块来满足,即只需要安装两个模块中的一个,我如何在install_requires行中表达出来?例如,setup.py如下所示:

setup(
    name='my_module',
    version='0.1.2',
    url='...',
    ...,
    install_requires=['numpy', 'tensorflow']
)

当这样做pip install my_module这将安装tensorflow(CPU(作为要求,即使安装了tensorflow-gpu(这也满足要求,但不能,因为它的名称不同(。

我可以做这样的事情吗:

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

setup.py只是另一个python脚本,因此您可以在其中放置任何逻辑来确定正确的设置参数。例如,您可以检查是否安装了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,而是在构建时执行一次。源发行版将很好地服务:

$ 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

您需要在设置函数中extras_require

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

然后可以安装:

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

最新更新