Попробуйте это:
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']
Возможно, вы указали очевидное, но разве вы импортировали importlib, прежде чем пытаться использовать 'importlib'? – idjaw
@ldjaw да, мои извинения за то, что не заявили, что в вопросе. Отредактированный вопрос для ясности. – DKNUCKLES
@idjaw просто попробовал и не любил :(Такое же сообщение об ошибке – DKNUCKLES