我需要知道是否存在python模块,而不导入它。
导入可能不存在的内容(不是我想要的):
try:
import eggs
except ImportError:
pass
要检查导入是否可以在python2中找到某些内容,请使用 imp
import imp
try:
imp.find_module('eggs')
found = True
except ImportError:
found = False
要查找点状导入,您需要执行以下操作:
import imp
try:
spam_info = imp.find_module('spam')
spam = imp.load_module('spam', *spam_info)
imp.find_module('eggs', spam.__path__) # __path__ is already a list
found = True
except ImportError:
found = False
您还可以使用pkgutil.find_loader
(与python3部分大致相同
import pkgutil
eggs_loader = pkgutil.find_loader('eggs')
found = eggs_loader is not None
您应该使用importlib
,我如何做到这一点是:
import importlib
spam_loader = importlib.find_loader('spam')
found = spam_loader is not None
我的期望是,如果您可以找到它的装载机,那么它存在。您也可以对此更加聪明,例如过滤掉您将接受的装载程序。例如:
import importlib
spam_loader = importlib.find_loader('spam')
# only accept it as valid if there is a source file for the module - no bytecode only.
found = issubclass(type(spam_loader), importlib.machinery.SourceFileLoader)
在Python3.4中,不推荐使用importlib.find_loader
python文档,而推荐使用importlib.util.find_spec
。推荐的方法是importlib.util.find_spec
。还有其他类似的东西importlib.machinery.FileFinder
,如果您要加载特定的文件,则很有用。弄清楚如何使用它们超出了此范围。
import importlib
spam_spec = importlib.util.find_spec("spam")
found = spam_spec is not None
这也适用于相对进口,但您必须提供起始包装,因此您也可以这样做:
import importlib
spam_spec = importlib.util.find_spec("..spam", package="eggs.bar")
found = spam_spec is not None
spam_spec.name == "eggs.spam"
虽然我确定这样做是有原因的-我不确定会是什么。
尝试查找子模块时,它将导入父模块(适用于上述所有方法)!
food/
|- __init__.py
|- eggs.py
## __init__.py
print("module food loaded")
## eggs.py
print("module eggs")
were you then to run
>>> import importlib
>>> spam_spec = importlib.find_spec("food.eggs")
module food loaded
ModuleSpec(name='food.eggs', loader=<_frozen_importlib.SourceFileLoader object at 0x10221df28>, origin='/home/user/food/eggs.py')
欢迎对此发表评论
find_loader
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句