Вызов методов из динамического списка модулей

1

Я пытаюсь сделать здесь две вещи, динамически импортировать все модули в каталог (количество/имена неизвестны), а затем для каждого из найденных модулей вызывается функция, называемая checkMe(). checkMe() гарантированно будет в каждом модуле, поэтому нет необходимости проверять. Это то, что у меня есть до сих пор:

Импортировать

import sys
import os
import glob

pathname = os.path.dirname(sys.argv[0]) + "/"
pathname = pathname + "/modules/"

__modules__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(pathname)+"/*.py")]

for module in __modules__:
    __import__(module)

Вызов checkMe()

for module in __modules__:
    m = getattr(sys.modules[__name__], module)
    getattr(m, 'checkMe').__call__()

Но я получаю эту ошибку:

AttributeError: 'module' object has no attribute 'sendme'

(sendme - первый модуль)

Любая помощь очень ценится... спасибо!

  • 0
    Добавьте оператор печати, чтобы показать, что вы получаете за pathname , __modules__ и т. Д.
  • 0
    Я почти уверен, что импорт работает ... Я отладил это и больше не получаю ошибок для этих строк.
Показать ещё 2 комментария
Теги:
module

1 ответ

0

__import__ имеет несколько сложную семантику относительно пакетов (каталогов, содержащих __init__.py) и модулей. Вам нужно будет использовать аргумент fromlist чтобы он работал. Как бы то ни было, запуск модуля по пути проще всего с помощью runpy (из комментариев: run_path требует Python 2.7 или новее):

import runpy
runpy.run_path('path/to/file.py')
  • 0
    Как я уже говорил выше, я почти уверен, что импорт работает, это вызов методов в тех модулях, с которыми у меня возникают реальные проблемы
  • 0
    @pdeuchler Нет, импорт не возвращает ожидаемый модуль. help(__import__) должна убедить вас.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню