2016-04-01 80 views
0

我想在已發佈的軟件包中導入一個模塊,並且正在尋找正確的方法。如何在發佈的包中選擇性地導入模塊?

有關可選模塊的幾個現有問題已經提交併指向此處。 What's Python good practice for importing and offering optional features? 但他們都依靠try except ImportError:塊工作。

有關更好的方法(python版本特定)來檢查模塊存在的更近期討論如下:How to check if a python module exists without importing it它提供了很好的檢查方法,但他們陷入ImportError掩碼模塊問題的危險,而不是實際的不存在。一般性討論似乎圍繞一個版本或另一個版本的獨立代碼,而不是針對任何版本和發行版的軟件包。

所以,如果我將二者結合起來討論,我得到這個:

def module_exists(module_name): 
    import sys 
    import pkgutil 
    import importlib 

    if sys.version_info < (3,0): 
     return pkgutil.find_loader(module_name) is not None 

    elif sys.version_info >= (3,0) and sys.version_info <= (3,3): 
     return importlib.find_loader(module_name) is not None 

    elif sys.version_info > (3,3): 
     return importlib.util.find_spec(module_name) is not None 

    return False 

我擔心的是,這似乎是脆弱的。或者至少就像我正在重塑一個車輪。

我應該繼續使用try except ImportError的舊答案嗎?因爲,與第二個引用的ImportError關注點不同,如果它在導入時出錯,我仍然不能實際使用當前模塊。或者,有禮貌的事情是嘗試使用它並因當前模塊的問題而崩潰,而不是假裝它不在(ImportError)的時候?

我的用例只是爲了提供增強功能,如果某個模塊存在於廣泛分佈的包的一個本地化配置文件下。我不想讓任何其他本地化的用戶承擔一個根本無法幫助他們的模塊的需求。即使沒有第三方模塊,正常功能也會繼續。

回答

0

使用

try: 
    import somemodule 
except ImportError: 
    # handle module not being available 

這其實並不重要ImportError是否屏蔽與所述模塊或者不是一個問題 - 你只關心它是否可進口,所以進口是最好的檢驗。

+0

真的那麼簡單嗎?所以我應該忽略某個人實際擁有該模塊的情況,但它已經被破壞了。如在,這是他們的問題。我只是繼續前進,好像它不在那裏。 – Dethpickle

+0

我這麼認爲 - 你不能修復他們壞掉的模塊,所以不要理它。否則,你可能會冒很多複雜的代碼,可能會導致_still_失效。 – snakecharmerb

+0

聽起來不錯。坦率地說,這就是爲什麼沒有一個更明智的現有解決方案更復雜的唯一解釋。謝謝! – Dethpickle