Функция импорта модулей из списка

#python #import

Вопрос:

Моя цель состоит в том, чтобы иметь функцию со списком строк в качестве входных данных и импортировать те модули, которые я хочу для своего кода.

Пример:

 list_of_modules = ['module1', 'module2']

def importer(list_of_modules):
    for module in list_of_modules:
        if module == 'module1':
            from package.package2.module1 import function1
        if module == 'module2':
            from package.package2.module2 import function1
        if module == 'module3':
            from package.package2.module3 import function1
 

Я попробовал это решение, и кажется, что модули не импортируются. Я также пытался использовать встроенную функцию импорта, но ничего.

Мой реальный пример был:

 def importer(modules):
    for value in modules:
        if value == "ble_connection":
            from top_app.module.connection.test_connectivity import connection1
        if value == "switch_connection":
            from top_app.module.connection.test_connectivity import connection2
 

Я должен добавить, что я использую pytest для запуска тестов из общего файла conftest, и этот вызывает эту функцию импорта во время крючка pytest_configure, который находится сразу после крючка обнаружения.

У вас есть какое-нибудь решение для этого?

Спасибо

Комментарии:

1. Это должно сработать, хотя эта функция 1 будет перезаписана.

2. В качестве альтернативы вы можете использовать importlib модуль.

3. Можете ли вы добавить свою попытку использования __import__ ?

4. Как вы проверили, что это не работает? Пожалуйста, покажите нам свой тестовый код. Например, print(function1) будет достаточно строки после цикла for.

5. Я пробовал импортировать , но, похоже, ничего не импортируется

Ответ №1:

Я бы использовал exec для этой цели:

 list_of_modules = ['module1', 'module2']
for module in list_of_modules:
    exec('package.package2.{} import function1'.format(module))
 

но, как кто-то прокомментировал вашу операцию, function1 это будет перезаписано.

Комментарии:

1. Спасибо за ответ. В конце концов я использовал крючок pytest_collection_modifyitems из pytest. Это работает довольно хорошо. Хотя это просто позволяет вам деактивировать некоторые тестовые функции, но пакеты все равно импортируются.