Подтвердить что ты не робот

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.

4b9b3361

Ответ 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)