我正在为python发行版foo编写安装脚本.我的代码需要BeautifulSoup,因此当前目录的结构如下:
<root>/
setup.py
__init__.py
foo.py
BeautifulSoup/
__init__.py
BeautifulSoup.py
etc.
setup.py当前看起来像这样(较少的元信息):
setup(name='foo',
version='0.9.0',
py_modules=['foo']
)
我希望包括BeautifulSoup,以防用户尚未安装它,但是如果他们已经以特定版本安装了它,我也不想安装它.我在Python 2.7.2 docs中注意到,我应该在setup.py文件中包含packages [[…]].
但是,Section 2.4. Relationships between Distributions and Packages提到有一种方法可以指定需要特定版本的软件包.我在setup.py中找不到任何有关如何使用“要求表达式”的示例,因此我不确定这是否是我所需要的.
简而言之,我需要一种说法:
This package requires
BeautifulSoup
, with at least X.X.X version. If that version isn’t installed, use the one that’s provided.
我怎么做?
解决方法:
目录结构:
<root>/
setup.py
foo.py
注意:没有__init__.py文件.
您可以使用distribute
指定依赖项setup.py:
from setuptools import setup
setup(name='foo',
version='0.9.0',
py_modules=['foo'],
install_requires=['BeautifulSoup >= X.X.X'],
)
如果尚未安装,则将安装所需版本的BeautifulSoup.在这种情况下,您无需提供BeautifulSoup.
如果您不想自动安装BeautifulSoup:
<root>/
setup.py
foobar/
__init__.py
foo.py
BeautifulSoup/
__init__.py
BeautifulSoup.py
etc.
setup.py:
from setuptools import setup, find_packages
setup(name='foobar',
version='0.9.0',
packages=find_packages(),
) #NOTE: no install_requires
在模块中的某个位置:
import pkg_resources
try:
pkg_resources.require("BeautifulSoup>=X.X.X")
except pkg_resources.ResolutionError:
from foobar import BeautifulSoup
else:
import BeautifulSoup
这是一种不太理想且不寻常的方法.