在Python包中需要BeautifulSoup - setup.py中需要什么?

3 投票
1 回答
1145 浏览
提问于 2025-04-17 02:56

我正在为一个名为 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

这种方法不太常见,也不是最理想的选择。

撰写回答