使用 importlib.util 检查库时出错
Error when using importlib.util to check for library
我正在尝试使用 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")
试试这个:
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
是模块,第二个是 class,而在 importlib.util
情况下,两者都是模块。所以也许 module.module
不正确,除非已经加载了两个模块的代码,而 module.class
是正确的,因为 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
并得到一个AttributeError
,util
(连同其他子模块)得到loaded/initialized ,现在您 可以 访问 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']
我正在尝试使用 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")
试试这个:
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
是模块,第二个是 class,而在 importlib.util
情况下,两者都是模块。所以也许 module.module
不正确,除非已经加载了两个模块的代码,而 module.class
是正确的,因为 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
并得到一个AttributeError
,util
(连同其他子模块)得到loaded/initialized ,现在您 可以 访问 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']