Предположим, у меня есть две почти идентичные версии пакета mymod python, то есть mymod0 и mymod1. Каждый из этих пакетов имеет файлы init .py и foo.py, а foo.py - единственная функция printme(). Вызов mymod0.foo.printme() будет печатать «Я - mymod0», а вызов mymod1.foo.printme() будет печатать «Я - mymod1». Все идет нормально.Динамически загружать пакет в python
Но теперь мне нужно динамически импортировать либо mymod0, либо mymod1. Пользователь будет вводить либо 0, либо 1 к сценарию (как переменная «индекс»), а затем я могу создать PACKAGENAME = «MyMod» ул (индекс) +
Я попытался это:
module=importlib.import_module(module_name)
module.foo.printme()
Но Я получаю эту ошибку: AttributeError: объект 'module' не имеет атрибута 'foo'
Как я могу указать, что пакет теперь должен называться модулем, так что module.foo.printme() будет работать?
UPDATE: Таким образом, проще всего использовать функцию exec(). Таким образом, я могу динамически создать оператор импорта, как это:
cmdname="from mymod%s import foo" % index
exec(cmdname)
Тогда:
foo.printme()
Это похоже на работу.
Хорошо это близко, но то, что я хочу сделать, это динамически воссоздать этот импорт: импорт mymod0 как MyMod. Итак, здесь mymob теперь ссылается на пакет mymod0. Если я сделаю это статически, тогда я могу без проблем назвать mymod0.foo.printme(). Как я могу воссоздать это динамически? – Marc
@ Маркс, пожалуйста, см. Мое редактирование. Заметьте, я не тестировал это – miraculixx