2013-06-15 2 views
3

У меня есть структура данных, которая выглядит, как это в Python 2,7питон и динамический импорт вложенных каталогов

myfile.py 
--parsers 
    --folder1 
    file1.py 
     def filemethod(data=None) 
      pass 

Под анализаторами папки, я могу добавить много подпапок

Я всегда буду знать, то имя функция, которую я хочу назвать, но

Как мне импортировать каталог парсера, чтобы найти методы в каждом из подкаталогов и получить доступ к myfile.py. Я использую getattr для преобразования имени в объект функции. Это необходимо, потому что я получаю имя функции для вызова из удаленного вызова в очередь redis.

import ?????? 
methodToCall = getattr('filemethod', 'file1') 
methodToCall(data) 

ответ

3

Хороший способ сделать динамический импорт использует imp.load_source():

import imp 
module = imp.load_source('mymodule', module_full_path) 

в вашем случае это будет что-то вроде:

module = imp.load_source('file1', '.\parsers\file1.py') 
methodToCall = getattr(module, 'filemethod') 
methodToCall(data) 

Убедитесь, что вы замените 'file1' и '.\parsers\file1.py' с вашим имя желаемого модуля и правильный путь к его исходному файлу.

0

Другой способ - сначала импортировать подкаталоги с parsers/__init__.py.

parsers/__init__.py:

import folder1 
import folder2 
... 

затем:

import parsers 
foldername = 'folder1' # for example 
mod = getattr(parsers, foldername) 
methodToCall = getattr(mod, 'filemethod') 
methodToCall(data) 
Смежные вопросы