2012-06-28 70 views
5

目前我的一個軟件包需要一個JSON解析器/編碼器,並且如果可用的話,設計爲使用simplejson,如果需要的話回落到json模塊(在標準庫中)(如基準顯示simplejson更快)。我可以在setuptools中定義可選軟件包嗎?

但是,最近&錯過simplejson將在使用zc.buildout時安裝 - 我相信轉移到github。這讓我想知道;是否可以在我的setup.py文件中定義可選軟件包,如果不可用,它將不會停止安裝我的軟件包?

回答

0

AFAIK沒有辦法定義一個可選包,並且沒有用處。當你定義一個可選包時,你期望什麼?當它尚未可用時安裝它? (這會以某種方式使它成爲強制性的)

不,恕我直言,解決這個問題的正確方法是在你想要使用包的導入中。 E.g:

try: 
    from somespecialpackage import someapi as myapi 
except ImportError: 
    from basepackage import theapi as myapi 

當然這需要兩個API是兼容的,但這是simplejson的情況和標準庫json包。

+2

可選意味着,如果包裝不安裝,安裝即可完成暢通無阻。 –

+0

好的,但是如果你沒有*重要的依賴*,爲什麼把它放在*必需的軟件包中?我只是不明白這一點。 – Constantinius

+0

我不想把它放到'required'列表中;這就是我所要求的 - 是否有另一種選擇,所以如果可以的話,我可以包括它,但如果不可以,則忽略它? –

6

安裝時的可選軟件包。

我假設您正在談論您的setup.py腳本。後者安裝simplejson>=3.5.3

  • pip install mypackage
  • pip install mypackage[with_simplejson]

: 你可以改變它具有:

# mypackage/setup.py 

extras = { 
    'with_simplejson': ['simplejson>=3.5.3'] 
} 

setup(
    ... 
    extras_require=extras, 
    ...) 

那麼你可以做任何的。

而不是試圖安裝所有東西並回退到已知的良好版本, 您會希望安裝您認識的軟件包的子集。

執行時的可選軟件包。

一旦你有兩套不同的軟件包可以安裝,你需要 ,以確保你可以使用它們,如果它們可用。例如。您json進口:

try: 
    # helpful comment saying this should be faster. 
    import simplejson as json 
except ImportError: 
    import json 

另一個更爲複雜的例子:

try: 
    # xml is dangerous 
    from defusedxml.cElementTree import parse 
except ImportError: 
    try: 
     # cElementTree is not available in older python 
     from xml.cElementTree import parse 
    except ImportError: 
     from xml.ElementTree import parse 

但你也可以找到一些包這種模式:

try: 
    optional_package = None 
    import optional.package as optional_package 
except ImportError: 
    pass 

... 

if optional_package: 
    # do addtional behavior 
相關問題