Python 使用importlib.util检查库时出错
我试图使用importlib库来验证是否在执行Python 3.5.2中脚本的计算机上安装了nmap库 我试图使用importlib.util.find_spec(“nmap”)但收到以下错误Python 使用importlib.util检查库时出错,python,python-3.x,python-importlib,Python,Python 3.x,Python Importlib,我试图使用importlib库来验证是否在执行Python 3.5.2中脚本的计算机上安装了nmap库 我试图使用importlib.util.find_spec(“nmap”)但收到以下错误 >>> import importlib >>> importlib.util.find_spec("nmap") Traceback (most recent call last): File "<stdin>", line 1, in <mod
>>> import importlib
>>> importlib.util.find_spec("nmap")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
试试这个:
from importlib import util
util.find_spec("nmap")
我打算调查,但老实说,我不知道为什么一个有效,另一个无效。此外,请观看以下互动课程:
>>> import importlib
>>> importlib.util
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
>>> from importlib import util
>>> util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
>>> importlib.util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
因此,它可能是importlib
所特有的
更新#3
正如@kfb在评论中指出的,它似乎确实与importlib
有关。请参阅下面的评论:
importlib/util.py
确实导入了importlib.\u bootstrap
,因此我假设这是真实的。如果我的理解是正确的,当您执行导入导入导入lib时,子模块将被初始化,但不会为您导入的导入导入导入lib模块对象初始化。此时,如果执行dir(importlib)
操作,将不会看到util
。有趣的是,在您尝试访问importlib.util
并获得AttributeError
后,util
(以及其他子模块)将被加载/初始化,现在您可以访问importlib.util
>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'find_loader', 'import_module', 'invalidate_caches', 'reload', 'sys', 'types', 'warnings']
>>> importlib.util
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
>>> importlib.util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings']
导入导入库
>>>处长(进口管制)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_模块“,”使_缓存无效“,”重新加载“,”系统“,”类型“,”警告“]
>>>importlib.util
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:模块“importlib”没有属性“util”
>>>importlib.util
>>>处长(进口管制)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU“,”导入模块“,”使缓存无效“,”机械“,”重新加载“,”系统“,”类型“,”util“,”警告“]
可能是在说明显而易见的问题,但您在尝试使用
importlib
之前是否执行了importlib
?@ldjaw是的,很抱歉在问题中没有说明这一点。为清晰起见,编辑了问题。@idjaw刚刚尝试,没有爱情:(相同的错误消息。我尝试了这个,它说util不存在,很漂亮-看起来像是这样!这个没有返回任何东西,我理解这意味着它工作正常。谢谢!@DKNUCKLES,太好了!不确定为什么它不以其他方式工作…在我更新的答案中看到奇怪的交互会话。谢谢为此。我希望我能不止一次地为你的帮助投票。我已经能够拼凑出一些对我有用的东西,我将在我的问题中发布。看起来是这样。@DKNUCKLES没问题!当像你这样有趣的问题出现时,我很高兴。这对提问者和提问者来说都是一个学习的好机会回答者!
>>> import datetime
>>> datetime
<module 'datetime' from '/usr/lib/python3.5/datetime.py'>
>>> datetime.datetime
<class 'datetime.datetime'>
>>> import urllib
>>> urllib
<module 'urllib' from '/usr/lib/python3.5/urllib/__init__.py'>
>>> urllib.error
<module 'urllib.error' from '/usr/lib/python3.5/urllib/error.py'>
# Until bootstrapping is complete, DO NOT import any modules that attempt
# to import importlib._bootstrap (directly or indirectly). Since this
# partially initialised package would be present in sys.modules, those
# modules would get an uninitialised copy of the source version, instead
# of a fully initialised version (either the frozen one or the one
# initialised below if the frozen one is not available).
>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'find_loader', 'import_module', 'invalidate_caches', 'reload', 'sys', 'types', 'warnings']
>>> importlib.util
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
>>> importlib.util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings']