如何在不导入的情况下检查python模块是否存在

我需要知道是否存在python模块" title="python模块">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

回答:

Python3≤3.3

您应该使用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≥3.4

在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')

欢迎对此发表评论

回答:

  • @rvighne用于importlib
  • @ lucas-guido用于python3.3 +的描述 find_loader
  • @enpenax用于python2.7中的pkgutils.find_loader行为

以上是 如何在不导入的情况下检查python模块是否存在 的全部内容, 来源链接: utcz.com/qa/410741.html

回到顶部