Lokalna kolekcja pakietów Pythona: najlepszy sposób ich importowania?

Muszę wysłaćkolekcja programów Pythona, które używają wielupakiety przechowywane w lokalnymLibrary katalog: celem jest uniknięcie instalowania przez użytkowników pakietów przed użyciem moich programów (pakiety są dostarczane wLibrary informator). Jaki jest najlepszy sposób importowania pakietów zawartych wLibrary?

Wypróbowałem trzy metody, ale żadna z nich nie wydaje się idealna: czy istnieje prostsza i solidniejsza metoda? lub czy jedna z tych metod jest najlepsza?

W pierwszej metodzieLibrary folder jest po prostu dodawany do ścieżki biblioteki:

import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))

import package_from_Library

TheLibrary folder jest umieszczany na początku, więc pakiety dostarczane z moimi programami mają pierwszeństwo przed tymi samymi modułami zainstalowanymi przez użytkownika (w ten sposób jestem pewien, że mają poprawną wersję do pracy z moimi programami). Ta metoda działa również, gdyLibrary folder nie znajduje się w bieżącym katalogu, co jest dobre. Jednak takie podejście ma wady. Każdy z moich programów dodaje kopię tej samej ścieżki dosys.path, co jest marnotrawstwem. Ponadto wszystkie programy muszą zawierać te same trzy linie modyfikujące ścieżki, co jest sprzeczne z zasadą Nie powtarzaj siebie.

Poprawa powyższych problemów polega na próbie dodaniaLibrary ścieżka tylko raz, wykonując to w importowanym module:

# In module add_Library_path:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))

a następnie użyć w każdym z moich programów:

import add_Library_path
import package_from_Library

W ten sposób, dzięki mechanizmowi buforowania CPython, moduładd_Library_path jest uruchamiany tylko raz iLibrary ścieżka jest dodawana tylko razsys.path. Wadą tego podejścia jest jednak toimport add_Library_path ma niewidzialny efekt uboczny, a kolejność importu ma znaczenie: powoduje to, że kod jest mniej czytelny i bardziej delikatny. Wymusza to także na mojej dystrybucji programówadd_Library_path.py program, którego użytkownicy nie będą używać.

Pytonmoduły zLibrary można także importować, tworząc z niego pakiet (pusty__init__.py plik przechowywany w środku), który pozwala:

from Library import module_from_Library

Jednak to się psujepakiety wLibrary, ponieważ mogą zrobić coś takiegofrom xlutils.filter import …, który się psuje, ponieważxlutils nie znaleziono wsys.path. Ta metoda działa, ale tylko wtedy, gdy zawiera modułyLibrary, nie paczki.

Wszystkie te metody mają pewną wadę.

Czy istnieje lepszy sposób wysyłania programów z kolekcją pakietów (których używają) przechowywanych w lokalnymLibrary informator? lub czy jest to jedna z powyższych metod (metoda 1?) najlepsza z możliwych?

PS: W moim przypadku wszystkie pakiety zLibrary są czystymi pakietami Pythona, ale najlepszym rozwiązaniem jest bardziej ogólne rozwiązanie, które działa dla każdego systemu operacyjnego.

PPS: Celem jest, aby użytkownik mógł korzystać z moich programów bez konieczności instalowania czegokolwiek (poza kopiowaniem regularnie wysyłanego przeze mnie katalogu), jak w powyższych przykładach.

PPPS: Dokładniej, celem jest łatwość elastycznościaktualizacja zarówno moja kolekcja programów, jak i powiązane z nimi pakiety innych firmLibrary dzięki temu, że użytkownicy wykonująprosta kopia katalogu zawierającego moje programy iLibrary folder „ukrytych” pakietów innych firm. (Często robię aktualizacje, więc wolę nie zmuszać użytkowników do aktualizowania dystrybucji Pythona.)

questionAnswers(2)

yourAnswerToTheQuestion