Python 3.4: Как импортировать модуль с полным путем?
Как я могу загрузить модуль Python в Python 3.4, учитывая его полный путь?
Аналогичный вопрос Как импортировать модуль с полным путём? охватывает версии Python до 3.4, но вывод заключается в том, что поддержка в Python 3.4 устарела для представленных ответы, поэтому любое решение для Python 3.4 оценено.
Обратите внимание, что этот вопрос не является дубликатом Импортировать произвольный исходный файл python. (Python 3.3+), так как ответы на это также используют loader.load_module()
, который устарел в Python 3.4, как сказано в answer, с подробными сведениями в Рассмотрите возможность оставить importlib.abc.Loader.load_module() и документацию в importlib.
Поэтому необходимо поддерживать поддерживаемое решение для импорта модуля по полному пути в Python 3.4.
Ответы
Ответ 1
Это должно работать для всех файлов python, независимо от расширения файла:
import importlib.machinery
modulename = importlib.machinery.SourceFileLoader('modulename','/Path/To/module.py').load_module()
Этот метод упоминался в сообщении об отказе в документации imp.load_module
.
Ответ 2
Искренний ответ работает, но излишне неуклюже. Более простой способ:
import sys, os, importlib
sys.path.append(os.path.dirname(filename))
mname = os.path.splitext(os.path.basename(filename))[0]
imported = importlib.import_module(mname)
sys.path.pop()
imported
- импортированный модуль; вы можете использовать его как обычно, через imported.method(arg)
. Окончательная строка не является строго необходимой, но она чище не оставлять ненужные записи в sys.path
(особенно если вы собираетесь запускать код несколько раз). Это работает в 3.4 и не использует ничего, что было бы устаревшим.
Ответ 3
Поддерживаемый и не устаревший метод в соответствии с 3.6 docs выглядит следующим образом:
def import_file(full_name, path):
"""Import a python module from a path. 3.4+ only.
Does not call sys.modules[full_name] = path
"""
from importlib import util
spec = util.spec_from_file_location(full_name, path)
mod = util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
Ответ 4
Функция ниже работает в Python 3.4 - она используется для загрузки и запуска определенных функций в модулях, но вам нужно добавить папку в путь sys.
sys.path.append("path_to_your_file_to_import")
tool = {'file':'test_tool.py',
'function':'sum_even_numbers',
'args':['list'],
'return':['int']
}
args = [1,2,3]
def run(tool, args, silent='Y'):
if silent == 'N':
print('main called ' + tool['file'] + '->' + tool['function'] + ' with ', args, ' = ', tool['return'])
mod = __import__( os.path.basename(tool['file']).split('.')[0])
func = getattr(mod, tool['function'])
tool['return'] = func(args)
return tool['return']
Позвонить через
run(tool, args)