如何检查模块是否可以导入?

时间:2014-01-06 19:35:33

标签: python module styles

我在脚本中使用模块,但主机应用程序中的一个操作不会加载此模块,因此脚本失败。如果失败因为它不需要运行就没关系,但我不想看到错误消息框。

有没有办法检查模块是否可用,例如:

isavailable ( mymodule )

# safe to use the module

但是我也想让函数提前返回,如果它不可用就会中断执行。

6 个答案:

答案 0 :(得分:3)

try:
    import my_module
except ImportError:
    available = False
else:
    available = True

答案 1 :(得分:2)

您可以执行以下操作:

import importlib

def import_if_available(name, package=None):
    try:
        return importlib.import_module(name, package)
    except ImportError:
        return None

print import_if_available('os.path')

来自importlib文档。

importlib包的目的是双重的。一种是在Python源代码中提供import语句的实现(因此,扩展名为 import ()函数)。这提供了import的实现,可以移植到任何Python解释器。这也提供了一种参考实现,这种实现比用Python之外的编程语言实现的参考实现更容易理解。 第二,实现导入的组件在此包中公开,使用户可以更轻松地创建自己的自定义对象(通常称为导入程序)来参与导入过程。有关自定义导入程序的详细信息,请参阅PEP 302。

答案 2 :(得分:1)

检查模块是否可用的最简单方法是导入它。这几乎总是你想要的。如果模块不可用,则会失败。如果该模块可用......那么,您需要检查的原因是您需要验证是否可以导入它,因此您现在不必浪费任何时间进行导入。

更一般地说,在Python中,它是easier to ask forgiveness than permission。如果你想知道你能否做某事,那就试试吧。

所以,这几乎是一个答案:

import mymodule

代码将"提前返回,如果执行不可用则中断执行。"唯一的问题是您不希望看到错误消息。

有两种解决方法。


首先,您可以像这样包装代码:

try:
    import mymodule
except ImportError:
    pass
else:
    # everything else you were going to do.

是否"代码"是整个函数体,或调用函数的代码行,或脚本或模块中的一大块顶级代码,或者其他什么,它没有区别。


如果你想避免额外的块缩进,你可以及早退出&#34;以各种不同的方式。 (虽然实际上,将所有缩进的代码提取到一个新函数中几乎总是微不足道的,这意味着你最终只能在else块中进行单行函数调用。)< / p>

你如何做到这一点取决于你试图从哪个级别回来,而你的问题并不清楚。如果您想从函数中提前返回,只需return(可能具有适当的值)。如果您想要从整个计划提前返回,只需sys.exit(0)。所以:

try:
    import mymodule
except ImportError:
    sys.exit(0)
# the rest of your code

您还可以exit使用正值,这是一种告诉shell或其他任何调用程序的方法,它会失败&#34;,而不会打印错误回溯。

答案 3 :(得分:0)

虽然想要一个被调用的函数来暂停执行有点不寻常,但可以执行它,如下所示。您必须将模块的名称作为字符串传递给函数,因为可能变量mymodule在调用时仍然不存在。如果成功,它将返回导入的模块,以便将结果分配给变量名以供后续使用。

import sys

def isavailable(modulename):
    try:
        module = __import__(modulename)
    except ImportError:
        sys.exit(1)  # stop execution
    else:
        return module

样本用法:

mymodule = isavailable('mymodule')  # program will terminate if not found
mymodule.method()

答案 4 :(得分:0)

我不确定这是否来晚了,但我相信使用 sys.modules dict 来检查这个问题的一种简单方法是:

import sys

if 'my_module' in sys.modules: 
    print ('Module available')
else:
    print ('Module not available')

如果你想把它放在一个函数中:

import sys

def isavailable(m):
    if m in sys.modules: 
        return True
    else:
        return False

isavailable('mymodule')

答案 5 :(得分:0)

sys.modules 检查似乎更优雅?不幸的是,在笔记本中工作时,在 py 文件中使用时似乎不起作用 python mycode.py。 不知道为什么 - 我猜“替换用户并按任意键?”

import sys

# https://stackoverflow.com/questions/20957811/how-to-check-if-a-module-is-available-for-import
if 'geopandas' in sys.modules:
    print ('geopandas is available')
else:
    print ('geopandas is not available') # for whatever reason prints this when in fact is available

# redundant, just for the record

try:
    import geopandas as gpd
except ImportError:
    print('Geopandas is not available. Please "conda install geopandas",\n \
    or switch environment where geopandas is installed "conda activate geopandas_env_name"')
    sys.exit(0)
# the rest of your code

import numpy as np
import pandas as pd