python - 使用 importlib.util 检查库时出错

标签 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 <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")

最佳答案

试试这个:

from importlib import util
util.find_spec("nmap")

我打算进行调查,但老实说,我不知道为什么一个有效而另一个无效。此外,请观察以下交互式 session :

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

正如 @kfb 在评论中指出的那样,它似乎确实与 importlib 具体相关。请参阅 __init__.py for importlib 中的以下评论:

# 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 does import importlib._bootstrap 所以我假设这是真实的。如果我的理解是正确的,当您执行 import importlib 时,子模块将被初始化,但不会为您导入的 importlib 模块对象进行初始化。此时,如果您执行 dir(importlib),您将看不到 util。有趣的是,您尝试访问 importlib.util 并收到 AttributeErrorutil(以及其他子模块)被加载/初始化,现在您可以访问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']

关于python - 使用 importlib.util 检查库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39660934/

相关文章:

Python pandas 标记将一个数据帧中的列中的值与另一个数据帧中的列进行匹配

python - 使用 importlib.import_module 处理导入模块引发的异常

python - 如何在 python 中使用 __code__ 获取包装函数的 firSTLineno?

python - pandas read_csv index_col=None 不使用每行末尾的分隔符

python - 将 CSV 直接下载到 Python CSV 解析器中

python - Numpy 的 'linalg.solve' 和 'linalg.lstsq' 没有给出与 Matlab 的 '\' 或 mldivide 相同的答案

python - 如何使用python csv reader查看A列中的行是否存在于B列中

python - 如果列表包含相同的元素,则在嵌套列表中组合列表?

python - 在 python 中将带有 NaN 的 Numpy 数组写入 CSV

python - 在Python 3中动态导入模块时出现问题