如果设计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']
答案 0 :(得分:2)
您的设置功能需要extras_require
:
extras_require = {
'gpu': ['tensorflow-gpu'],
'cpu': ['tensorflow']
},
然后可以安装:
pip install your_package[gpu]
或pip install your_package[cpu]
答案 1 :(得分:2)
setup.py
只是另一个python脚本,所以你可以在其中放入任何逻辑来确定正确的设置args。例如,您可以检查是否安装了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
,而是在 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