Мне нужно знать, существует ли модуль Python, не импортируя его.
Импортировать то, что может не существовать (не то, что я хочу):
try:
import eggs
except ImportError:
pass
python
python-import
yarbelk
источник
источник
Ответы:
python2
Чтобы проверить, может ли импорт найти что-то в python2, используйте
imp
Чтобы найти точечный импорт, вам нужно сделать больше:
Вы также можете использовать
pkgutil.find_loader
(более или менее так же, как часть Python3python3
Python3 ≤ 3.3
Вы должны использовать
importlib
, как я делал это было:Я ожидаю, что если вы можете найти загрузчик для этого, то он существует. Вы также можете быть немного умнее, например, отфильтровывая, какие загрузчики вы примете. Например:
Python3 ≥ 3.4
В Python3.4
importlib.find_loader
документы на python устарели в пользуimportlib.util.find_spec
. Рекомендуемый метод -importlib.util.find_spec
. Есть и другие подобныеimportlib.machinery.FileFinder
, которые полезны, если вы хотите загрузить определенный файл. Выяснить, как их использовать, выходит за рамки этого.Это также работает с относительным импортом, но вы должны предоставить начальный пакет, так что вы также можете сделать:
Хотя я уверен, что есть причина для этого - я не уверен, что это будет.
ПРЕДУПРЕЖДЕНИЕ
При попытке найти подмодуль, он импортирует родительский модуль (для всех вышеперечисленных методов)!
комментарии добро пожаловать на это
Подтверждения
find_loader
источник
eggs.ham.spam
.spam
вeggs.ham
вы будете использоватьimp.find_module('spam', ['eggs', 'ham'])
imp
не рекомендуется в пользуimportlib
Python 3.pkgutil.find_loader("my.package.module")
возвращает загрузчик, если пакет / модуль существует, аNone
если нет. Пожалуйста, обновите свой ответ для Python 2, так как маскировка ImportError свела меня с ума вчера xPПосле использования ответа Ярбелк я сделал это, так как не нужно импортировать
ìmp
.Полезно,
settings.py
например, в Django .источник
Python 3> = 3.6: ModuleNotFoundError
Он
ModuleNotFoundError
был введен в Python 3.6 и может быть использован для этой целиОшибка возникает, когда модуль или один из его родителей не может быть найден. Так
напечатает сообщение, которое выглядит,
No module named 'eggs'
еслиeggs
модуль не может быть найден; но напечатает что-то вроде,No module named 'eggs.sub'
если толькоsub
модуль не может быть найден, ноeggs
пакет может быть найден.См. Документацию системы импорта для получения дополнительной информации о
ModuleNotFoundError
источник
Python 2, не полагаясь на ImportError
Пока текущий ответ не обновлен, вот путь для Python 2
Почему другой ответ?
Многие ответы используют ловлю
ImportError
. Проблема в том, что мы не можем знать, что бросаетImportError
.Если вы импортируете свой существующий модуль и
ImportError
в вашем модуле окажется (например, опечатка в строке 1), результатом будет то, что ваш модуль не существует. Для того, чтобы выяснить, что ваш модуль существует,ImportError
он пойман и заставляет вещи молча терпеть неудачу.источник
ImportError
- пожалуйста, отредактируйте, если это было неясно для вас.Ответ go_as как один вкладыш
источник
Я столкнулся с этим вопросом, когда искал способ проверить, загружен ли модуль из командной строки, и хотел бы поделиться своими мыслями о тех, кто придет после меня и ищет то же самое:
Метод файла сценария Linux / UNIX : создать файл
module_help.py
:Затем убедитесь, что это исполняемый файл:
chmod u+x module_help.py
И назвать это с
pipe
кgrep
:Интерактивный метод : в консоли загрузить
python
Если найдено,
q
выйдите из чтения, набрав Для выхода из интерактивного сеанса python нажмите Ctrl+D
Метод файла сценария Windows также совместим с Linux / UNIX, и в целом лучше :
Вызов это из команды, как:
Будет вывод:
и вам придется нажать,
q
чтобы выйти из интерактивного режима.Используем неизвестный модуль:
Будет вывод:
и выход.
источник
Используйте одну из функций из pkgutil , например:
источник
Упрощенный оператор if из AskUbuntu: как проверить, установлен ли модуль в Python?
источник
Вы можете написать небольшой скрипт, который попытается импортировать все модули и сказать, какие из них работают с ошибками, а какие работают:
Вывод:
Слово предупреждения, это попытается импортировать все, так что вы увидите такие вещи,
PyYAML failed with error code: No module named pyyaml
потому что фактическое имя импорта просто yaml. Так что, пока вы знаете свой импорт, это должно помочь вам.источник
Я написал эту вспомогательную функцию:
источник
Вы также можете использовать
importlib
напрямуюисточник
Невозможно надежно проверить, можно ли импортировать «пунктирный модуль» без импорта его родительского пакета. Сказав это, есть много решений проблемы "как проверить, существует ли модуль Python".
Ниже приведено решение проблемы, при которой импортированный модуль может вызвать ImportError, даже если он существует. Мы хотим отличить ту ситуацию от такой, в которой модуль не существует.
Python 2 :
Python 3 :
источник
в django.utils.module_loading.module_has_submodule
источник