2011-09-23 54 views
3

我正在为python发行版编写一个安装脚本foo。我的代码需要BeautifulSoup,所以目前我的目录结构像这样:在Python包中需要BeautifulSoup - setup.py中需要什么?

<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中使用“require表达式”的示例,所以我不确定这是否是我需要的。

总之,我需要一个方式说:

该开发包需要BeautifulSoup,至少X.X.X版本。如果未安装该版本,请使用提供的版本。

我该怎么做?

回答

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 

这是一个少可取和不寻常的方法。

+0

既然'__init __。py'在那里,我将如何更改我的设置脚本? –

+0

@Ben McCormack:我已经更新了答案。 – jfs