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

亚伯克(Yarbelk):

我需要知道是否存在python模块,而不导入它。

导入可能不存在的内容(不是我想要的):

try:
    import eggs
except ImportError:
    pass
亚伯克(Yarbelk):

Python2

要检查导入是否可以在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

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行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python 3.5+:如何在给定完整文件路径的情况下动态导入模块(存在隐式同级导入)?

TestCafe-如何在不通过测试的情况下检查Web元素是否存在?

Python 3.4:如何在给定完整路径的情况下导入模块?

如何在不阅读的情况下检查通道是否关闭?

如何在不使用fs.exists的情况下检查文件或目录是否存在?

python defaultdict如何在不创建键的情况下检查嵌套键是否存在或为[]

如何在不查看Python扩展名的情况下检查文件是否存在?

如何在不导入的情况下模仿Python模块?

如何在不导入模块的情况下运行模块?

如何在不更改导入的情况下将Python 3模块更改为软件包?

如何在不阻塞的情况下检查Java中是否存在文件?

如何在不真正导入的情况下使用长python模块包的别名?

如何在不导入的情况下从python文件获取函数

如何在不更改其行为的情况下检查是否调用了@ patched-out python方法?

如何在不导入Julia的功能的情况下加载软件包模块

如何在tensorflow中不生成警告的情况下检查是否存在GPU

如何在没有CORB警告的情况下检查URL是否存在?

在不运行.Py的情况下导入Python模块

如何在不构建模块的情况下向Python公开C ++类

如何在不使用导入的情况下导入导入其他模块的模块*

如何在不导入的情况下从已编译的Python模块获取函数名?

如何在不执行python -m的情况下使用相对导入?

如何在不导入外部模块(matplotlib除外)的情况下绘制运行平均值?

如何在不多次调用 .getJSONObject(key) 的情况下检查 JSONObject 中是否存在属性?

如何在不迭代的情况下从查询中检查 ActiveRecord 是否存在?

如何在不导入其他模块的情况下更改python中文本的颜色?

如何在不加载关联模型的情况下检查 has_one 是否存在

如何在不导入每个类的情况下创建具有不同类的 python 包

如何在不使用任何模块或导入的情况下使用 python 字典创建 CSV 表