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

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

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

导入可能不存在的东西(不是我想要的东西):

try:
    import eggsexcept ImportError:
    pass


慕姐4208626
浏览 2280回答 3
3回答

拉莫斯之舞

Python2要检查导入是否可以在python2中找到某些内容,请使用&nbsp;impimport&nbsp;imptry: &nbsp;&nbsp;&nbsp;&nbsp;imp.find_module('eggs') &nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;Trueexcept&nbsp;ImportError: &nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;False要查找虚线导入,您需要执行更多操作:import&nbsp;imptry: &nbsp;&nbsp;&nbsp;&nbsp;spam_info&nbsp;=&nbsp;imp.find_module('spam') &nbsp;&nbsp;&nbsp;&nbsp;spam&nbsp;=&nbsp;imp.load_module('spam',&nbsp;*spam_info) &nbsp;&nbsp;&nbsp;&nbsp;imp.find_module('eggs',&nbsp;spam.__path__)&nbsp;#&nbsp;__path__&nbsp;is&nbsp;already&nbsp;a&nbsp;list &nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;Trueexcept&nbsp;ImportError: &nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;False你也可以使用pkgutil.find_loader(或多或少与python3部分相同import&nbsp;pkgutil eggs_loader&nbsp;=&nbsp;pkgutil.find_loader('eggs')found&nbsp;=&nbsp;eggs_loader&nbsp;is&nbsp;not&nbsp;NonePython3Python3≤3.3您应该使用importlib,我是如何做到这一点的:import&nbsp;importlib spam_loader&nbsp;=&nbsp;importlib.find_loader('spam')found&nbsp;=&nbsp;spam_loader&nbsp;is&nbsp;not&nbsp;None我的期望是,如果你能为它找到装载机,那么它就存在了。你也可以更聪明一点,比如过滤掉你会接受的装载机。例如:import&nbsp;importlib spam_loader&nbsp;=&nbsp;importlib.find_loader('spam')#&nbsp;only&nbsp;accept&nbsp;it&nbsp;as&nbsp;valid&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;source&nbsp;file&nbsp;for&nbsp;the&nbsp;module&nbsp;-&nbsp;no&nbsp;bytecode&nbsp;only.found&nbsp;=&nbsp;issubclass(type(spam_loader),&nbsp;importlib.machinery.SourceFileLoader)Python3≥3.4在Python3.4中,importlib.find_loader&nbsp;python docs被弃用了importlib.util.find_spec。推荐的方法是importlib.util.find_spec。还有其他类似的importlib.machinery.FileFinder,如果您要加载特定文件,这将非常有用。弄清楚如何使用它们超出了这个范围。import&nbsp;importlib spam_spec&nbsp;=&nbsp;importlib.util.find_spec("spam")found&nbsp;=&nbsp;spam_spec&nbsp;is&nbsp;not&nbsp;None这也适用于相对导入但你必须提供起始包,所以你也可以这样做:import&nbsp;importlib spam_spec&nbsp;=&nbsp;importlib.util.find_spec("..spam",&nbsp;package="eggs.bar")found&nbsp;=&nbsp;spam_spec&nbsp;is&nbsp;not&nbsp;Nonespam_spec.name&nbsp;==&nbsp;"eggs.spam"虽然我确信这样做有理由 - 我不确定它会是什么。警告在尝试查找子模块时,它将导入父模块(对于所有上述方法)!food/ &nbsp;&nbsp;|-&nbsp;__init__.py&nbsp;&nbsp;|-&nbsp;eggs.py##&nbsp;__init__.pyprint("module&nbsp;food&nbsp;loaded")##&nbsp;eggs.pyprint("module&nbsp;eggs")were&nbsp;you&nbsp;then&nbsp;to&nbsp;run>>>&nbsp;import&nbsp;importlib>>>&nbsp;spam_spec&nbsp;=&nbsp;importlib.find_spec("food.eggs")module&nbsp;food&nbsp;loadedModuleSpec(name='food.eggs',&nbsp;loader=<_frozen_importlib.SourceFileLoader&nbsp;object&nbsp;at&nbsp;0x10221df28>,&nbsp;origin='/home/user/food/eggs.py')欢迎回答这个问题致谢@rvighne for importlib@ lucas-guido for python3.3 + depricating&nbsp;find_loader@enpenax用于python2.7中的pkgutils.find_loader行为

Smart猫小萌

Python 2,不依赖于ImportError在更新当前答案之前,这是Python 2的方法import&nbsp;pkgutilimport&nbsp;importlibif&nbsp;pkgutil.find_loader(mod)&nbsp;is&nbsp;not&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;importlib.import_module(mod)return&nbsp;None为什么另一个答案许多答案都利用了捕捉ImportError。问题是,我们无法知道是什么抛出了ImportError。如果您导入了existant模块并且模块中恰好有一个ImportError(例如第1行的拼写错误),结果将是您的模块不存在。它将花费你相当多的回溯来确定你的模块是否存在并且ImportError被捕获并使事情无声地失败。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python