栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Python2

要检查导入是否可以在python2中找到某些内容,请使用

imp

import imptry:    imp.find_module('eggs')    found = Trueexcept importError:    found = False

要查找点状导入,您需要执行以下操作:

import imptry:    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 = Trueexcept importError:    found = False

您还可以使用

pkgutil.find_loader
(与python3部分大致相同

import pkgutileggs_loader = pkgutil.find_loader('eggs')found = eggs_loader is not None

Python3

Python3≤3.3

您应该使用

importlib
,我如何做到这一点是:

import importlibspam_loader = importlib.find_loader('spam')found = spam_loader is not None

我的期望是,如果您可以找到它的装载机,那么它存在。您也可以对此稍加精明,例如过滤掉您将接受的装载程序。例如:

import importlibspam_loader = importlib.find_loader('spam')# only accept it as valid if there is a source file for the module - no bytepre 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 importlibspam_spec = importlib.util.find_spec("spam")found = spam_spec is not None

这也适用于相对进口,但您必须提供起始包装,因此您也可以这样做:

import importlibspam_spec = importlib.util.find_spec("..spam", package="eggs.bar")found = spam_spec is not Nonespam_spec.name == "eggs.spam"

虽然我确定这样做是有原因的-我不确定会是什么。

警告

尝试查找子模块时,它将导入父模块(适用于上述 所有 方法)!

food/  |- __init__.py  |- eggs.py## __init__.pyprint("module food loaded")## eggs.pyprint("module eggs")were you then to run>>> import importlib>>> spam_spec = importlib.find_spec("food.eggs")module food loadedModuleSpec(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行为


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号