2016-04-01 42 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