Dynamic import modules python

How To Load / Import Python Package, Module Dynamically

Python provide built-in function __import__(name[, globals[, locals[, fromlist[, level]]]]) for us to load / import python module in python source code dynamically. The name parameter is the module name in string format. The fromlist parameter is a boolean value. When fromlist is True, it means the module name can contain package name ( for example lib.mod1), when fromlist is False, it means the module name should not contain the module package ( for example mod1 ).

The __import__() function returns the imported module object if import success. If the module does not exist, then it will throw ModuleNotFoundError error. This article will show you how to use the __import__() function with examples.

1. Load / Import Python Module Dynamically Example Steps.

python-dynamically-import-modules-example

  1. Create a PyDev project in eclipse ( How To Run Python In Eclipse With PyDev ).
  2. Create below package and modules, there are 3 modules mod1, mod2, mod3 in com.dev2qa.example.import.lib package. We will import the three modules dynamically in the TestImportFunction module.
  3. There are 2 methods in each lib module ( mod1, mod2, mod3 ).
  4. mod1.py
def method_1(): print("mod1.method_1()") def method_2(): print("mod1.method_2()")
def method_3(): print("mod1.method_3()") def method_4(): print("mod1.method_4()")
def method_5(): print("mod1.method_5()") def method_6(): print("mod1.method_6()")
# Import getmembers, isfunction function from inspect module. from inspect import getmembers, isfunction # This function will list all the functions and attributes of the module. def list_module_attributes(mod_name): # First import the module object by module name. imported_module = __import__(mod_name, globals=None, locals=None, fromlist=True) # The dir() function will return all attributes and functions of the module object. mod_attrs_str = dir(imported_module) print(mod_attrs_str) ''' The inspect.getmembers() function will get all members of the module object. The inspect.isfunction() function will check whether the module member is a function or not. Below code will return module functions only. ''' functions_list = [o for o in getmembers(imported_module) if isfunction(o[1])] # Each element in the functions_list is a tuple object. for func in functions_list: # The first element of the tuple is the function name. print(func[0]) # This function let you input multiple module name and import them one by one. def import_multiple_modules(): # Input module names separated by white space. inp = input("Input multiple module-name separated with white space: ").strip() # Split module names. args = inp.split(" ") # Loop in the module names list. for mod_name in args: try: ''' Import module by it's name, the fromlist = True make the module name can contain package name. The return value is the imported module object. ''' imported_module = __import__(mod_name, globals=None, locals=None, fromlist=True) # Print the imported moudle name. print(imported_module.__name__) # If the module do not exist, then throw ModuleNotFound error. except ModuleNotFoundError as e: print(e) # This function let you import one module and run the specified module function. def import_one_module(): # Let user input module name and function name. inp = input("Input module-name function-name separated with white space: ").strip() # Split the argument to get module-name and function-name. args = inp.split(" ") if(len(args) == 2): # Get module name and function name. mod_name = args[0] func_name = args[1] # Import the module by name, and return the module object. fromlist = True make the module name can contain package name. imported_module = __import__(mod_name, globals=None, locals=None, fromlist=True) #imported_module = __import__(mod_name, globals=None, locals=None, fromlist=False) # Print imported module name. print("Imported module name is ", imported_module.__name__) # If the module contain the input function. if(hasattr(imported_module, func_name)): # Get the function attribute. func = getattr(imported_module,func_name) # Run the function. func() else: print("Module ", mod_name, " do not has function ", func_name) else: print("Input arguments count error.") if __name__ == '__main__': import_one_module() #import_multiple_modules() #list_module_attributes('lib.mod1') #list_module_attributes('lib.mod2') #list_module_attributes('lib.mod3')
# When input correct module name and method name. >>>Input module-name function-name separated with white space: lib.mod1 method_1 Imported module name is lib.mod1 mod1.method_1() ------------------------------------------------------------------------ # When input correct module name and wrong method name >>>Input module-name function-name separated with white space: lib.mod1 method Imported module name is lib.mod1 Module lib.mod1 do not has function method ------------------------------------------------------------------------ # When input wrong module name. >>>Input module-name function-name separated with white space: lib.mod method_1 Traceback (most recent call last): File "/Users/songzhao/Documents/WorkSpace/dev2qa.com-example-code/PythonExampleProject/com/dev2qa/example/import/TestImportFuncton.py", line 67, in import_one_module() File "/Users/songzhao/Documents/WorkSpace/dev2qa.com-example-code/PythonExampleProject/com/dev2qa/example/import/TestImportFuncton.py", line 45, in import_one_module imported_module = __import__(mod_name, globals=None, locals=None, fromlist=True) ModuleNotFoundError: No module named 'lib.mod'
>>>Input multiple module-name separated with white space: lib.mod1 lib.mod lib.mod2 lib.mod1 No module named 'lib.mod' lib.mod2

2. Question & Answer.

2.1 How to fix ImportError: No module named mod when import python modules dynamically.

  1. There is a ‘modules’ directory in my python app, and there are two python modules module_1.py and module_2.py in the ‘modules’ directory. And my team member may add more python module files such as module_3.py, module_4.py …… in the modules directory, so I want to dynamically import all the python modules in the python app modules directory like below.
# First get all the module files name in the python app modules directory. all_module_files_array = [] all_module_files_array = os.listdir('modules') # Set the python modules directory to the system path variable. sys.path.append('/Users/jerry/test_python_app/modules') # Loop in the module files array. for mod in all_module_files_array: # Import the python module by file name. import mod

But when I run the above source code, it shows the ImportError: No module named mod error. How to fix this error?

# First import the python importlib module. import importlib # Get all the module files name in the python app modules folder. all_module_files_array = [] all_module_files_array = os.listdir('modules') . # Loop in the module files array. for mod in all_module_files_array: # Import the python mod with importlib.import_module() method. importlib.import_module(mod)

Источник

Читайте также:  Cbitrixcomponenttemplate include php template

Модуль importlib

Python предлагает пакет importlib в качестве части стандартной библиотеки модулей. Его задача – обеспечить реализацию оператора импорта Python, а также функции __import__(). В дополнение, importlib дает программисту возможность создать собственный объект (т.н. импортер), который может быть использован для процесса импорта.

Что насчет imp?

Существует еще один модуль, под названием imp, который предоставляет интерфейс механизмам, стоящим за оператором Python import. Этот модуль считается устаревшим для Python 3.4. Предполагается, что importlib следует использовать вместо него.

Этот модуль весьма сложный в использовании, так что мы ограничим наш кругозор, и сосредоточимся на следующих темах:

  • Динамический импорт
  • Проверка на возможность импорта модуля
  • Удобный сторонний модуль под названием import_from_github_com

Динамический импорт

Модуль importlib поддерживает возможность импорта модуля, который был передан строке. Так что давайте создадим несколько простых модулей, с которыми мы сможем работать. Мы выделим каждому модулю одинаковый интерфейс, но дадим им выводить свои названия, чтобы увидеть разницу между ними. Создадим два модуля с разными названиями, вроде foo.py и bar.py, и добавим в них следующий код:

Теперь нам остается только использовать importlib чтобы импортировать их. Давайте посмотрим на следующий код, чтобы сделать именно это. Убедитесь в том, что этот код находится в той же папке, что и созданные ранее два модуля.

Здесь мы импортируем модуль importlib и создаем очень простую функцию под названием dynamic_import. Все, что делает эта функция, это вызывает другую функцию importlib — import_module со строкой модуля, который мы ей передали, и возвращает результат этого вызова. Далее, в нашем условном операторе внизу, мы можем вызвать главный метод каждого модуля, который покорно выведет название модуля. Вы, скорее всего, не будете делать это часто в своем коде, но периодически вам может быть нужно импортировать модуль, когда он представлен только в виде строки. Модуль importlib дает возможность сделать именно это.

Читайте также:  Плавный скролл к якорю

Проверка импортируемости модуля

Python содержит стиль кодирования под названием EAFP: Easier to ask for forgiveness than permission (легче просить о прощении, чем разрешения). Это значит, что зачастую проще предположить, что что-то существует (к примеру, ключ в словаре), и словить ошибку, если это не так. Ранее мы пытались импортировать модуль, с вероятностью получить ошибку ImportError, если его не существует. Что если нам нужно проверить и увидеть, может ли модуль быть импортированным, чтобы исключить догадки? Вы можете добиться этого с importlib!

Здесь мы импортируем субмодуль из importlib под названием util. В первой части кода check_module содержится настоящая магия, которую мы можем увидеть. В ней мы вызываем функцию find_spec в строке модуля, которая была передана ранее. Сначала мы выполняем передачу фейкового названия, затем мы делаем то же, но с настоящим названием модуля Python. Если вы запустите этот код, вы увидите, что когда вы передаете название неустановленного модуля, функция find_spec вернет None и наш код выведет уведомление о том, что модуль не найден. Если он был найден, тогда мы вернем спецификацию модуля. Мы можем взять эту спецификацию и использовать её для импорта модуля. Или вы можете просто передать строку функции import_module, как мы делали в предыдущем разделе. По этой же причине мы и рассмотрим использование спецификации модуля в качестве альтернативного способа. Взгляните на функцию import_module_from_spec в описанном выше коде. Она принимает спецификацию модуля, которую вернула функция check_module. Далее мы передаем её функции module_from_spec, которая возвращает модуль import. В документации Python рекомендуется запустить модуль после его импорта, это мы и делаем при помощи функции exec_module. Наконец, мы получим модуль и запустим dir Python с ним, чтобы убедиться в том, что данный модуль такой, как мы ожидали.

Читайте также:  Latest java and jdk

Импорт из исходного файла

Субмодуль из importlib под названием util может делать один трюк, который я хочу рассмотреть. Вы можете использовать util для импорта модуля, используя только его путь файла и название. Давайте рассмотрим следующий пример, чтобы вы поняли, что к чему:

Источник

Оцените статью