Вопрос

Во время выполнения код Python получает имя загружаемого подмодуля, которого я раньше не знал.Теперь я хочу проверить, существует ли этот подмодуль внутри существующего модуля.Рассмотрим эту структуру, где foo и bar можно указать:

master/
|
|- __init__.py
|
|- foo/
|  |
|  |- __init__.py
|
|- bar/
   |
   |- __init__.py

Обычно я делаю это, что работает для определений и переменных:

import master

unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
    pass # all's well

или я ловлю AttributeError, который работает одинаково.

Однако с указанной выше файловой структурой я не могу реализовать этот подход и работать. hasattr() всегда возвращает False (то есть всегда выдается ошибка AttributeError).

Если я посмотрю dir(master), я вижу этот вывод:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

и даже явно указав __all__ в master/__init__.py не помогает, но меняет dir() на

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

Есть идеи, что я делаю неправильно, и есть ли способ провести такие тесты?(Кстати:Python 2.6 на Win/Cygwin, если это интересно)

Это было полезно?

Решение

Субмодули не являются атрибутами своих родительских модулей, если не указано иное.Просто попробуйте импортировать модуль и поймать ImportError:

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass

Другие советы

ты можешь сделать

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'

Недавно мне пришлось проверить существование подмодуля, и, поскольку я использую Python 3.4.1, я даю новый ответ на вопрос:

В Python 3.4.1 вы можете использовать importlib.util.find_spec(name, package=None) (https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec)

import importlib
module_exists = importlib.util.find_spec('path.to.my.module')

Это легко =)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top