Как лучше всего импортировать локальные модули?Python

Программы на Python
Ответить
Anonymous
 Как лучше всего импортировать локальные модули?

Сообщение Anonymous »

«Каковы PEP-совместимые способы импорта локального пакета даже из родительской папки с наименьшими предварительными предположениями?» — таким мог бы быть длинный заголовок. Я ищу решение, позволяющее использовать локальный пакет. Мои требования:
  • он должен быть совместим с PEP, т.е. как минимум наиболее распространенный PEP должен его поддерживать
  • Независимость от ОС, терминала, пользователя и среды, т.е. решение не должно зависеть от каких-либо конкретных обстоятельств.
Среди этих решений я ищу то, которое< /p>
  • самый простой способ реализовать
  • объем модификации является гибким (не обязательно выполнять каждый раз, но не является постоянным и общесистемным)
  • оставляет исходный код в самом простом виде, т.е. решение не требует большого количества лишних строк в коде
Решения
Это способы, которые я нашел на SO и других местах. Ни один из них мне не подходит, а как было сказано 8 лет назад, у каждого решения есть свои минусы. Тем не менее, я надеюсь, что в 2021 году мы сможем найти решение, отвечающее хотя бы двум моим требованиям.
Используйте conda
SO 1
Используйте среды conda и выполните conda, чтобы включить каталог в путь поиска Python с помощью conda development
, где может быть относительным или абсолютным. Затем Conda создает файл conda.pth в папке site-packages среды, и python будет предоставлено содержимое этого файла, поэтому он будет доступен в sys.path
Недостаток: требуется conda-build, но он присутствует не всегда.
Используйте pip
СО 2а, СО 2б, СО 3
Используйте pip для локальной установки пакета. Создайте файл setup.py, настройте его, перейдите туда, где он находится, затем установите пакет локально в редактируемом режиме с помощью pip install -e .
Недостаток: PEP 517 не поддерживает редактируемые установки, как указано в инструментах настройки.
прямой взлом sys.path
SO 2c
Добавить пути к sys.path непосредственно в скрипте Python, например:

Код: Выделить всё

import os
import sys

sys.path.insert("path")

import mymodule
Здесь путь может быть абсолютным или относительным, причем последний может быть независимым от ОС, например. с помощью os.path.sep.
Недостаток: он несовместим с PEP, поскольку не все операторы импорта находятся в верхней части файла. autopep8 изменит ваш код в неправильном порядке, однако есть обходные пути. Можно сказать, что это хороший пример того, как PEP можно пренебречь, но мне хотелось бы верить, что импорт достаточно прост, чтобы применять PEP без исключения.
изменить pythonpath
Измените путь к вашей системной среде или путь к pythonpath, добавив в него необходимый каталог.
Недостатки: он как минимум зависит от ОС и слишком глобальный, или, наоборот, нужен чтобы выполнять его каждый раз.
используйте относительный импорт
Из скрипта включите модуль, используя относительный импорт

Код: Выделить всё

from ..somewhere import mymodule
Это не работает, если этот модуль является основным, вы получите

Код: Выделить всё

ImportError: attempted relative import with no known parent package
более того, в PEP 8 говорится: «Относительный импорт для импорта внутри упаковки крайне не рекомендуется». Гвидо считает, что все в порядке.
Вопросы по теме
Это не дубликат общих вопросов о том, как импортировать модули за пределами верхнего уровня, потому что на эти вопросы уже есть ответы. ТАК 2, ТАК 3, ТАК 4, ТАК 5 ТАК 6, даже не питон

Подробнее здесь: https://stackoverflow.com/questions/675 ... al-modules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»