使用importlib.util检查库时出错

2024-05-23 08:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用importlib库来验证nmap库是否安装在执行Python 3.5.2脚本的计算机上

我试图使用importlib.util.find_spec("nmap"),但收到以下错误。

>>> 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'

有人能告诉我哪里出错了吗?

编辑

我可以使用下面的代码让函数工作。

#!/usr/bin/pythonw

import importlib
from importlib import util

#check to see if nmap module is installed
find_nmap = util.find_spec("nmap")
if find_nmap is None:
    print("Error")

Tags: import脚本mostifis计算机错误util
1条回答
网友
1楼 · 发布于 2024-05-23 08:41:15

试试这个:

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'>

所以…是的。我相信这对某人来说是很有意义的,但对我来说不是。我一想清楚就更新。

更新:

将此与以下内容进行比较:

>>> import datetime
>>> datetime
<module 'datetime' from '/usr/lib/python3.5/datetime.py'>
>>> datetime.datetime
<class 'datetime.datetime'>

我认为区别在于,在这种情况下,第一个datetime是一个模块,第二个是一个类,而在importlib.util情况下,两者都是模块。因此,可能module.module不正常,除非已经加载了来自两个模块的代码,而module.class正常,因为类代码是在导入模块时加载的。

更新#2

不,似乎在很多情况下module.module是好的。例如:

>>> 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'>

所以它可能是特定于importlib的。

更新#3

正如评论中指出的,它似乎确实与importlib特别相关。请参阅^{} for ^{}中的以下注释:

# 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).

importlib/util.py确实导入了importlib._bootstrap,所以我假设这是真实的。如果我的理解是正确的,那么当您执行import importlib操作时,子模块将被初始化,但不会为您导入的importlib模块对象初始化。此时,如果您执行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']

相关问题 更多 >

    热门问题