Локальная коллекция пакетов Python: лучший способ импортировать их?
Мне нужно отправитьколлекция программ Python, которые используют несколькопакеты хранится в местномLibrary
каталог: цель состоит в том, чтобы пользователи не устанавливали пакеты перед использованием моих программ (пакеты поставляются вLibrary
каталог). Каков наилучший способ импорта пакетов, содержащихся вLibrary
?
Я испробовал три метода, но ни один из них не выглядит идеальным: есть ли более простой и надежный метод? или один из этих методов лучший?
В первом методеLibrary
папка просто добавляется в путь к библиотеке:
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))
import package_from_Library
Library
папка помещается в начале, поэтому пакеты, поставляемые с моими программами, имеют приоритет над теми же модулями, которые установлены пользователем (таким образом, я уверен, что они имеют правильную версию для работы с моими программами). Этот метод также работает, когдаLibrary
папка не в текущем каталоге, что хорошо. Однако такой подход имеет недостатки. Каждая из моих программ добавляет копию одного и того же пути кsys.path
, который является пустой тратой. Кроме того, все программы должны содержать три одинаковые строки, изменяющие путь, что противоречит принципу «Не повторяйся».
Улучшение по сравнению с вышеупомянутыми проблемами состоит в попытке добавитьLibrary
путь только один раз, делая это в импортированном модуле:
# In module add_Library_path:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))
и затем использовать в каждой из моих программ:
import add_Library_path
import package_from_Library
Таким образом, благодаря механизму кэширования CPython, модульadd_Library_path
запускается только один раз, аLibrary
путь добавляется только один разsys.path
, Однако недостатком этого подхода является то, чтоimport add_Library_path
имеет невидимый побочный эффект и имеет значение порядок импорта: это делает код менее разборчивым и более хрупким. Кроме того, это заставляет мое распространение программ включатьadd_Library_path.py
программа, которую пользователи не будут использовать.
питонмодули изLibrary
можно также импортировать, сделав пакет (пустой__init__.py
файл хранится внутри), что позволяет сделать:
from Library import module_from_Library
Тем не менее, это нарушаетпакеты вLibrary
, как они могли бы сделать что-то вродеfrom xlutils.filter import …
, который ломается, потому чтоxlutils
не найден вsys.path
, Таким образом, этот метод работает, но только при включении модулей вLibrary
, а не пакеты.
Все эти методы имеют некоторый недостаток.
Есть ли лучший способ доставки программ с коллекцией пакетов (которые они используют), хранящихся в локальнойLibrary
каталог? или один из методов выше (метод 1?) лучше всего?
PS: В моем случае все пакеты изLibrary
являются чистыми пакетами Python, но лучше использовать более общее решение, которое работает для любой операционной системы.
PPSЦель состоит в том, чтобы пользователь мог использовать мои программы без необходимости устанавливать что-либо (кроме копирования каталога, в который я их регулярно отправляю), как в примерах выше.
PPPS: Точнее, цель состоит в том, чтобы иметь гибкость легкообновление моя коллекция программ и связанные с ними сторонние пакеты изLibrary
заставляя моих пользователей делатьпростая копия каталога, содержащего мои программы иLibrary
папка «скрытых» сторонних пакетов. (Я делаю частые обновления, поэтому я предпочитаю не заставлять пользователей обновлять свой дистрибутив Python).