python import搜索不模块_如何检查python模块是否存在而不导入它

Python2

要检查导入是否可以在python2中找到某些内容,请使用 impimport 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 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 docs被弃用了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 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 for importlib

@ lucas-guido for python3.3 + depricating find_loader

@enpenax用于python2.7中的pkgutils.find_loader行为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值