我在脚本中使用模块,但主机应用程序中的一个操作不会加载此模块,因此脚本失败。如果失败因为它不需要运行就没关系,但我不想看到错误消息框。
有没有办法检查模块是否可用,例如:
isavailable ( mymodule )
# safe to use the module
但是我也想让函数提前返回,如果它不可用就会中断执行。
答案 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.
是否"代码"是整个函数体,或调用函数的代码行,或脚本或模块中的一大块顶级代码,或者其他什么,它没有区别。
如果你想避免额外的块缩进,你可以及早退出"以各种不同的方式。 (虽然实际上,将所有缩进的代码提取到一个新函数中几乎总是微不足道的,这意味着你最终只能在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