目前我的一個軟件包需要一個JSON解析器/編碼器,並且如果可用的話,設計爲使用simplejson
,如果需要的話回落到json
模塊(在標準庫中)(如基準顯示simplejson
更快)。我可以在setuptools中定義可選軟件包嗎?
但是,最近&錯過simplejson
將在使用zc.buildout
時安裝 - 我相信轉移到github。這讓我想知道;是否可以在我的setup.py
文件中定義可選軟件包,如果不可用,它將不會停止安裝我的軟件包?
目前我的一個軟件包需要一個JSON解析器/編碼器,並且如果可用的話,設計爲使用simplejson
,如果需要的話回落到json
模塊(在標準庫中)(如基準顯示simplejson
更快)。我可以在setuptools中定義可選軟件包嗎?
但是,最近&錯過simplejson
將在使用zc.buildout
時安裝 - 我相信轉移到github。這讓我想知道;是否可以在我的setup.py
文件中定義可選軟件包,如果不可用,它將不會停止安裝我的軟件包?
AFAIK沒有辦法定義一個可選包,並且沒有用處。當你定義一個可選包時,你期望什麼?當它尚未可用時安裝它? (這會以某種方式使它成爲強制性的)
不,恕我直言,解決這個問題的正確方法是在你想要使用包的導入中。 E.g:
try:
from somespecialpackage import someapi as myapi
except ImportError:
from basepackage import theapi as myapi
當然這需要兩個API是兼容的,但這是simplejson
的情況和標準庫json
包。
我假設您正在談論您的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
可選意味着,如果包裝不安裝,安裝即可完成暢通無阻。 –
好的,但是如果你沒有*重要的依賴*,爲什麼把它放在*必需的軟件包中?我只是不明白這一點。 – Constantinius
我不想把它放到'required'列表中;這就是我所要求的 - 是否有另一種選擇,所以如果可以的話,我可以包括它,但如果不可以,則忽略它? –