Я пытаюсь сделать здесь две вещи, динамически импортировать все модули в каталог (количество/имена неизвестны), а затем для каждого из найденных модулей вызывается функция, называемая 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 - первый модуль)
Любая помощь очень ценится... спасибо!
__import__
имеет несколько сложную семантику относительно пакетов (каталогов, содержащих __init__.py
) и модулей. Вам нужно будет использовать аргумент fromlist
чтобы он работал. Как бы то ни было, запуск модуля по пути проще всего с помощью runpy
(из комментариев: run_path требует Python 2.7 или новее):
import runpy
runpy.run_path('path/to/file.py')
help(__import__)
должна убедить вас.
pathname
,__modules__
и т. Д.