2016-09-23 140 views
3

我试图使用导入库库检验nmap的库是否被安装在Python 3.5.2执行脚本的计算机错误使用importlib.util时检查库

我想上使用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") 
+0

可能会说明显而易见的,但是在尝试使用'importlib'之前,您是否'导入了importlib'? – idjaw

+0

@ldjaw是的,我很抱歉没有在问题中说明。编辑的问题清晰。 – DKNUCKLES

+0

@idjaw只是试图从导入库进口util' – DKNUCKLES

回答

9

试试这个:

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

由于@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确实进口importlib._bootstrap,所以我会认为这是realted。如果我的理解正确,那么当您执行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'] 
+1

美丽没有爱情:(相同的错误消息 – DKNUCKLES

+0

@DKNUCKLES,!。!很好!不知道为什么它不能以另一种方式工作......在我的更新答案中看到奇怪的交互式会话 – elethan

+0

非常感谢你这样做,我希望我可以多次提出你的答案,帮助你完成工作。我已经能够凑齐一些已经为我工作过的东西,我会在我的问题中发布。 – DKNUCKLES