2011-09-23 55 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