Python: функция импорта из файла, имя которого является переменной

У меня есть файл ./model_scripts/medians.py, содержащий функцию predict_volume(). [Вывод tree в терминале bash приведен ниже]

 model_scripts
 ├── __init__.py
 ├── medians.py
 └── ...

Мне нужно импортировать эту функцию в другой скрипт Python, где имя скрипта Python, из которого должна быть импортирована функция (т.е. medians.py), имеет форму строковой переменной. Код, который я написал:

model_name = 'medians'
...
model = getattr(__import__('model_scripts'), model_name)
vol = model.predict_volume()

Но я получаю следующую ошибку в первой строке:

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

Прочитав другие ответы (здесь ), я добавил __init__.py в каталог model_scripts. Но я все еще получаю вышеуказанную ошибку.

В этом ответе предлагается использовать importlib:

import importlib
model_name = 'medians'
...
model = importlib.import_module('model_scripts.'+model_name)
vol = model.predict_volume()

Буду признателен за любые идеи о том, почему первый подход не работает, а второй работает.


person IM94    schedule 07.03.2017    source источник
comment
Первый эквивалентен from model_scripts import medians, а второй эквивалентен import model_scripts.medians, которые являются двумя разными запросами.   -  person cdhowie    schedule 07.03.2017
comment
@cdhowie: Разве то, что я делаю, набирая `model = getattr(__import__('model_scripts'), model_name)', не совпадает с model = model_scripts.medians?   -  person IM94    schedule 07.03.2017
comment
Так должно быть. Это предполагает, что model_scripts даже экспортирует medians. Работает ли from model_scripts import medians так, как вы думаете?   -  person cdhowie    schedule 07.03.2017
comment
@cdhowie: Да, это работает, как и ожидалось. Однако, если имя модуля «медианы» является строковой переменной, я не могу импортировать ее таким образом.   -  person IM94    schedule 08.03.2017


Ответы (1)


Правильный синтаксис для __import__ здесь использует fromlist вместе с ним.

Следующие работы (прочитайте здесь):

model = getattr(__import__('model_scripts', fromlist=[model_name]), model_name)
person Shashank Dixena    schedule 08.03.2017