2016-09-23 2 views
3

Я пытаюсь использовать библиотеку importlib, чтобы проверить, установлена ​​ли птар библиотеки на компьютере, выполняющий скрипт в 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' 

Может кто-нибудь сказать мне, в чем я ошибаюсь?

EDIT

Я был в состоянии получить функцию для работы, используя следующий код.

#!/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 просто попробовал и не любил :(Такое же сообщение об ошибке – 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'> 

Итак ... да. Я уверен, что это имеет смысл для кого-то, но не для меня. Я уточню, как только я это выясню.

Update:

Сравнивая это что-то вроде:

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

Я думаю, что разница в том, что в этом случае первый datetime представляет собой модуль, а второй класс, в то время как в importlib.util случае оба являются модулями. Таким образом, возможно, module.module не в порядке, если код из обоих модулей не загружен, а module.class в порядке, потому что код класса загружается при импорте модуля.

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

Update # 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, подмодули будут инициализированы, но не инициализированы для объекта модуля , который вы импортировали. На данный момент, если вы делаете 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'] 
+1

Красиво - похоже, что это работает! Это возвращает ничего, что я понимаю, означает, что он работает так, как он Должно быть, спасибо! – DKNUCKLES

+0

@ DKNUCKLES, отлично! Не знаю, почему это не работает по-другому ... См. странную интерактивную сессию в моем обновленном ответе. – elethan

+0

благодарю вас за это. Хотелось бы, чтобы я мог поддержать ваш ответ больше, чем один раз за работу, которую вы вложили в помощь. Я смог сжечь что-то вместе, что сработало для меня, что я опубликую в своем вопросе. – DKNUCKLES

Смежные вопросы