Как я могу загрузить модуль Python, учитывая его полный путь? Обратите внимание, что файл может находиться где угодно в файловой системе, так как это опция конфигурации.
1143
Как я могу загрузить модуль Python, учитывая его полный путь? Обратите внимание, что файл может находиться где угодно в файловой системе, так как это опция конфигурации.
Ответы:
Для Python 3.5+ используйте:
Для Python 3.3 и 3.4 используйте:
(Хотя это не рекомендуется в Python 3.4.)
Для Python 2 используйте:
Есть эквивалентные вспомогательные функции для скомпилированных файлов Python и DLL.
Смотрите также http://bugs.python.org/issue21436 .
источник
__import__
.imp.load_source
только устанавливает.__name__
возвращаемый модуль. это не влияет на загрузку.imp.load_source()
определяет ключ новой записи, созданной вsys.modules
словаре, поэтому первый аргумент действительно влияет на загрузку.imp
Модуль является устаревшим , начиная с версии 3.4:imp
пакет находится на рассмотрении Deprecation в пользуimportlib
.Преимущество добавления пути к sys.path (по сравнению с использованием imp) состоит в том, что он упрощает процесс импорта нескольких модулей из одного пакета. Например:
источник
sys.path.append
чтобы указать на один файл Python вместо каталога?importlib.import_module(mod_name)
здесь можно использовать вместо явного импорта, если имя модуля неизвестно во время выполнения, но я бы добавилsys.path.pop()
в конце, хотя, предполагая, что импортированный код не пытается импортировать больше модулей, чем он используется.Если ваш модуль верхнего уровня не является файлом, но упакован как каталог с помощью __init__.py, то принятое решение почти работает, но не совсем. В Python 3.5+ необходим следующий код (обратите внимание на добавленную строку, начинающуюся с 'sys.modules'):
Без этой строки при выполнении exec_module он пытается связать относительный импорт в вашем верхнем уровне __init__.py с именем модуля верхнего уровня - в данном случае «mymodule». Но «mymodule» еще не загружен, поэтому вы получите ошибку «SystemError: Родительский модуль« mymodule »не загружен, не может выполнить относительный импорт». Поэтому вам нужно привязать имя, прежде чем загружать его. Причиной этого является фундаментальный инвариант системы относительного импорта: «Инвариантное удержание заключается в том, что если у вас есть sys.modules ['spam'] и sys.modules ['spam.foo'] (как вы сделали бы после вышеупомянутого импорта ), последний должен появляться как атрибут foo первого ", как обсуждалось здесь .
источник
mymodule
?/path/to/your/module/
на самом деле/path/to/your/PACKAGE/
? аmymodule
ты имеешь ввидуmyfile.py
?Чтобы импортировать ваш модуль, вам нужно добавить его каталог в переменную окружения, временно или постоянно.
Временно
Постоянно
Добавив следующую строку в ваш
.bashrc
файл (в linux) и исключениеsource ~/.bashrc
в терминале:Кредит / Источник: saarrrr , другой вопрос обмена стека
источник
Похоже, вы не хотите специально импортировать файл конфигурации (в котором есть много побочных эффектов и дополнительных сложностей), вы просто хотите запустить его и иметь доступ к полученному пространству имен. Стандартная библиотека предоставляет API специально для этого в виде runpy.run_path :
Этот интерфейс доступен в Python 2.7 и Python 3.2+
источник
result[name]
,result.get('name', default_value)
и т. Д.)from runpy import run_path; from argparse import Namespace; mod = Namespace(**run_path('path/to/file.py'))
Вы также можете сделать что-то вроде этого и добавить каталог, в котором находится файл конфигурации, к пути загрузки Python, а затем просто выполнить обычный импорт, предполагая, что вы заранее знаете имя файла, в данном случае «config».
Грязно, но это работает.
источник
Вы можете использовать
метод из имп модуля .
источник
imp.load_dynamic(module_name, path_to_file)
для DLLисточник
except:
предложения редко является хорошей идеей.save_cwd = os.getcwd()
try: …
finally: os.chdir(save_cwd)
this is already addressed by the standard library
да, но у питона есть неприятная привычка не быть обратно-совместимым ... так как проверенный ответ говорит, что до и после 3.3 есть 2 разных способа. В этом случае я бы предпочел написать свою собственную универсальную функцию, чем проверять версию на лету. И да, может быть, этот код не слишком хорошо защищен от ошибок, но он показывает идею (которая есть os.chdir (), хотя я не думаю об этом), на основе которой я могу написать лучший код. Отсюда +1.Вот код, который работает во всех версиях Python, начиная с 2.7-3.5 и, возможно, даже в других.
Я проверял это. Это может быть некрасиво, но пока единственный, который работает во всех версиях.
источник
load_source
нет, потому что он импортирует скрипт и обеспечивает доступ скрипта к модулям и глобальным переменным во время импорта.Я предложил слегка измененную версию замечательного ответа @ SebastianRittau (для Python> 3.4, я думаю), который позволит вам загрузить файл с любым расширением в качестве модуля, используя
spec_from_loader
вместоspec_from_file_location
:Преимущество кодирования пути в явном виде
SourceFileLoader
состоит в том, что механизм не будет пытаться определить тип файла по расширению. Это означает, что вы можете загрузить что-то вроде.txt
файла, используя этот метод, но вы не можете сделать этоspec_from_file_location
без указания загрузчика, потому что.txt
его нетimportlib.machinery.SOURCE_SUFFIXES
.источник
Вы имеете в виду загрузку или импорт?
Вы можете манипулировать
sys.path
списком, указать путь к вашему модулю, а затем импортировать ваш модуль. Например, дан модуль на:Вы могли бы сделать:
источник
sys.path[0:0] = ['/foo']
Explicit is better than implicit.
Так почему бы неsys.path.insert(0, ...)
вместоsys.path[0:0]
?Я считаю, что вы можете использовать
imp.find_module()
иimp.load_module()
для загрузки указанного модуля. Вам нужно будет отделить имя модуля от пути, т.е. если вы хотите загрузить,/home/mypath/mymodule.py
вам нужно сделать:... но это должно сделать работу.
источник
Вы можете использовать
pkgutil
модуль (в частности,walk_packages
метод), чтобы получить список пакетов в текущем каталоге. Оттуда тривиально использоватьimportlib
оборудование для импорта модулей, которые вы хотите:источник
Создать модуль python test.py
Создать модуль python test_check.py
Мы можем импортировать импортированный модуль из модуля.
источник
Эта область Python 3.4 кажется чрезвычайно сложной для понимания! Однако с небольшим количеством взлома, используя код от Криса Кэллоуэя как начало, мне удалось заставить кое-что работать. Вот основная функция.
Похоже, что для этого используются устаревшие модули из Python 3.4. Я не притворяюсь, что понимаю почему, но, похоже, это работает изнутри программы. Я обнаружил, что решение Криса работает в командной строке, но не внутри программы.
источник
Я не говорю, что это лучше, но ради полноты я хотел предложить
exec
функцию, доступную как в Python 2, так и в 3.exec
позволяет вам выполнять произвольный код либо в глобальной области, либо во внутренней области, предоставляется в виде словаря.Например, если у вас есть модуль, сохраненный в
"/path/to/module
«функции»foo()
, вы можете запустить его, выполнив следующее:Это делает более явным то, что вы загружаете код динамически, и дает вам некоторую дополнительную мощность, такую как возможность предоставления пользовательских встроенных функций.
И если для вас важен доступ через атрибуты, а не ключи, вы можете разработать собственный класс dict для глобалов, который обеспечивает такой доступ, например:
источник
Чтобы импортировать модуль из заданного имени файла, вы можете временно расширить путь и восстановить системный путь в ссылке на блок finally :
источник
Если у нас есть сценарии в одном проекте, но в разных каталогах, мы можем решить эту проблему следующим способом.
В этой ситуации
utils.py
находится вsrc/main/util/
источник
Это должно работать
источник
name, ext = os.path.splitext(os.path.basename(infile))
. Ваш метод работает, потому что предыдущее ограничение на расширение .py. Кроме того, вам, вероятно, следует импортировать модуль в некоторую переменную / словарную запись.Я сделал пакет, который использует
imp
для вас. Я называю это,import_file
и вот как это используется:Вы можете получить его по адресу:
http://pypi.python.org/pypi/import_file
или в
http://code.google.com/p/import-file/
источник
Импортировать модули пакета во время выполнения (рецепт Python)
http://code.activestate.com/recipes/223972/
источник
В Linux работает добавление символической ссылки в каталог, в котором находится ваш скрипт Python.
то есть:
Python создаст
/absolute/path/to/script/module.pyc
и обновит его, если вы измените содержимое/absolute/path/to/module/module.py
затем включите следующее в mypythonscript.py
источник
git
и проверив их,git status
чтобы убедиться, что ваши изменения в сценарии действительно возвращаются в исходный документ и не теряются в эфире.Я написал свою собственную глобальную и переносимую функцию импорта, основанную на
importlib
модуле, для:sys.path
от какого-либо хранилища путей поиска.Структура каталогов примеров:
Зависимость включения и порядок:
Реализация:
Магазин последних изменений: https://sourceforge.net/p/tacklelib/tacklelib/HEAD/tree/trunk/python/tacklelib/tacklelib.py
test.py :
testlib.py :
testlib.std1.py :
testlib.std2.py :
testlib.std3.py :
Выход (
3.7.4
):Испытано в Python
3.7.4
,3.2.5
,2.7.16
Плюсы :
testlib.std.py
какtestlib
,testlib.blabla.py
какtestlib_blabla
и так далее).sys.path
или от того, что когда-либо хранилище пути поиска.SOURCE_FILE
иSOURCE_DIR
между вызовамиtkl_import_module
.3.4.x
и выше] Может смешивать пространства имен модуля во вложенныхtkl_import_module
вызовах (например:named->local->named
илиlocal->named->local
и так далее).3.4.x
и выше] Может автоматически экспортировать глобальные переменные / функции / классы, откуда они были объявлены, во все дочерние модули, импортированные черезtkl_import_module
(черезtkl_declare_global
функцию).Минусы :
3.3.x
и ниже] Требуется объявитьtkl_import_module
во всех модулях, к которым обращаютсяtkl_import_module
(дублирование кода)Обновление 1,2 (
3.4.x
только и выше):В Python 3.4 и выше вы можете обойти требование объявления
tkl_import_module
в каждом модуле, объявивtkl_import_module
в модуле верхнего уровня, и функция внедрит себя во все дочерние модули за один вызов (это своего рода импорт саморазвития).Обновление 3 :
Добавлена функция в
tkl_source_module
качестве аналога bashsource
с поддержкой контроля выполнения при импорте (реализована с помощью слияния модулей вместо импорта).Обновление 4 :
Добавлена функция
tkl_declare_global
автоматического экспорта глобальной переменной модуля во все дочерние модули, где глобальная переменная модуля не видна, поскольку не является частью дочернего модуля.Обновление 5 :
Все функции перенесены в библиотеку tacklelib, см. Ссылку выше.
источник
Есть пакет, который посвящен этому конкретно:
Он протестирован во всех версиях Python (также в Jython и PyPy), но может оказаться излишним в зависимости от размера вашего проекта.
источник
Добавив это в список ответов, я не смог найти ничего, что сработало. Это позволит импортировать скомпилированные (pyd) модули Python в 3.4:
источник
довольно простой способ: предположим, вы хотите импортировать файл с относительным путем ../../MyLibs/pyfunc.py
Но если вы сделаете это без охраны, вы, наконец, сможете пройти очень длинный путь
источник
Простое решение, использующее
importlib
вместоimp
пакета (протестировано для Python 2.7, хотя оно должно работать и для Python 3):Теперь вы можете напрямую использовать пространство имен импортируемого модуля, например так:
Преимущество этого решения в том, что нам даже не нужно знать фактическое имя модуля, который мы хотели бы импортировать , чтобы использовать его в нашем коде. Это полезно, например, в случае, если путь модуля является настраиваемым аргументом.
источник
sys.path
, что не подходит для каждого варианта использования.sys.path.pop()
Этот ответ является дополнением к ответу Себастьяна Риттау, отвечающему на комментарий: «а что, если у вас нет названия модуля?» Это быстрый и грязный способ получения вероятного имени модуля python по имени файла - он просто идет вверх по дереву, пока не найдет каталог без
__init__.py
файла, а затем превратит его обратно в имя файла. Для Python 3.4+ (использует pathlib), что имеет смысл, поскольку пользователи Py2 могут использовать «imp» или другие способы выполнения относительного импорта:Конечно, есть возможности для улучшения, и необязательные
__init__.py
файлы могут потребовать других изменений, но если у вас есть__init__.py
вообще, это делает свое дело.источник
Лучший способ, я думаю, из официальной документации ( 29.1. Imp - доступ к внутренним компонентам импорта ):
источник