__import__
возвращает вновь импортированный модуль; имена из этого модуля являются не добавлены в глобал, так что вам нужно, чтобы получить Example
класс в качестве атрибута из возвращаемого модуля:
module = __import__('controller.'+file)
hello = module.Example('Hello world')
__import__
довольно низкий уровень, вы, вероятно, хотите использовать importlib.import_module()
вместо :
import importlib
module = importlib.import_module('controller.'+file)
hello = module.Example('Hello world')
Если вам нужно динамически получить имя класса тоже использовать getattr()
:
class_name = 'Example'
hello_class = getattr(module, class_name)
hello = hello_class('Hello world')
Werkzeug пакет (используется колба) предлагает полезные функции здесь: werkzeug.utils.import_string()
импортирует объект динамически:
from werkzeug.utils import import_string
object_name = 'controller.{}:Example'.format(file)
hello_class = import_string(object_name)
Это инкапсулирует выше процесс.
Вы должны быть чрезвычайно осторожным с принятием имен из веб-запросов и использованием этих имен модулей. Проведите дезинфекцию аргумента file
и позвольте буквенно-цифровым методам предотвращать использование относительного импорта.
Вы можете использовать werkzeug.utils.find_modules()
function, чтобы ограничить возможные значения file
здесь:
from werkzeug.utils import find_modules, import_string
module_name = 'controller.{}'.format(file)
if module_name not in set(find_modules('controller')):
abort(404) # no such module in the controller package
hello_class = import_string(module_name + ':Example')
Есть ли у вас конкретная причина использовать '__import __ ()' instea d 'import module'? –