在Python包中需要BeautifulSoup - setup.py中需要什么?
我正在为一个名为 foo
的 Python 项目写一个安装脚本。我的代码需要用到 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
的情况下把它包含进来,但如果用户已经安装了特定版本的 BeautifulSoup
,我又不想重复安装。我在 Python 2.7.2 的文档 中看到,应该在我的 setup.py 文件里加入 packages=[...]
。
不过,第 2.4 节:分发包和包之间的关系 提到有一种方法可以指定需要特定版本的包。我找不到如何在 setup.py 中使用“需要表达式”的例子,所以不确定这是否是我需要的。
简单来说,我需要一种方式来说明:
这个包需要
BeautifulSoup
,版本至少是 X.X.X。如果没有安装这个版本,就使用提供的版本。
我该怎么做呢?
1 个回答
4
目录结构:
<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
这种方法不太常见,也不是最理想的选择。