3

我正在为 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它,但如果他们已经在特定版本上安装了它,我也不想安装它。我注意到我应该在我的 setup.py 文件中包含Python 2.7.2 文档。packages=[...]

但是,第 2.4 节。Distributions 和 Packages 之间的关系提到有一种方法可以指定需要特定版本的包。我找不到任何关于如何在 setup.py 中使用“需要表达式”的示例,所以我不确定这是否是我需要的。

简而言之,我需要一种方式来表达:

这个包需要BeautifulSoup,至少有 XXX 版本。如果未安装该版本,请使用提供的版本。

我怎么做?

4

1 回答 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.

设置.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

这是一种不太理想和不寻常的方法。

于 2011-09-23T14:07:44.547 回答