如果设计一个 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脚本,因此您可以在其中放置任何逻辑来确定正确的设置参数。例如,您可以检查是否安装了tensorflow
或tensorflow_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]
源