Jaka jest różnica między modułem Python a pakietem Python?
Zobacz także: Jaka jest różnica między „pakietem” a „modułem” (dla innych języków)
Jaka jest różnica między modułem Python a pakietem Python?
Zobacz także: Jaka jest różnica między „pakietem” a „modułem” (dla innych języków)
__init__.py
plik.from plumbum.cmd import ls
implementacja__init__.py
Odpowiedzi:
Moduł to pojedynczy plik (lub pliki), które są importowane w ramach jednego importu i używane. na przykład
Pakiet to zbiór modułów w katalogach, które nadają hierarchię pakietów.
Dokumentacja modułów
Wprowadzenie do pakietów
źródło
__path__
atrybutem.__init__.py
pliku. Są to moduły, które mogą zawierać inne moduły.__path__
Każdy plik Pythona jest modułem , którego nazwa jest podstawową nazwą pliku bez
.py
rozszerzenia. Pakiet jest zbiorem modułów Pythona: podczas gdy moduł jest pojedynczy plik Python, pakiet jest katalogiem modułów Pythona zawierających dodatkowy__init__.py
plik, aby odróżnić pakiet z katalogu, który właśnie dzieje się zawierać kilka skryptów Pythona. Pakiety można zagnieżdżać na dowolnej głębokości, pod warunkiem, że odpowiednie katalogi zawierają własny__init__.py
plik.Rozróżnienie między modułem a pakietem wydaje się utrzymywać tylko na poziomie systemu plików. Podczas importowania modułu lub pakietu odpowiedni obiekt utworzony przez Python jest zawsze typu
module
. Pamiętaj jednak, że podczas importowania pakietu tylko zmienne / funkcje / klasy z__init__.py
pliku tego pakietu są bezpośrednio widoczne, a nie podpakiety lub moduły. Jako przykład rozważxml
pakiet w standardowej bibliotece Pythona: jegoxml
katalog zawiera__init__.py
plik i cztery podkatalogi; podkatalogetree
zawiera__init__.py
plik i, między innymi,ElementTree.py
plik. Zobacz, co się stanie, gdy spróbujesz interaktywnie zaimportować pakiet / moduły:W Pythonie są również wbudowane moduły, takie jak
sys
, napisane w C, ale nie sądzę, że powinieneś brać pod uwagę te pytania.źródło
module
. Jestem w trakcie pisania debugera i martwiłem się, że mój debuger nie powiedział, że moje pakiety tomodule
s.import
instrukcją, ponieważ myślniki nie są dozwolone w identyfikatorach Pythona. Użyjimportlib.import_module()
zamiast tego.Ze słownika Python :
Pliki Python z myślnikiem w nazwie, na przykład
my-file.py
, nie mogą być importowane za pomocą prostejimport
instrukcji. Pod względem koduimport my-file
jest to ten sam,import my - file
który spowoduje wyjątek. Takie pliki lepiej scharakteryzować jako skrypty, podczas gdy pliki do importu to moduły .źródło
Po pierwsze, należy pamiętać, że w swojej dokładnej definicji moduł jest obiektem w pamięci interpretera języka Python, często tworzonym przez odczyt jednego lub więcej plików z dysku. Chociaż możemy nieformalnie wywołać plik dyskowy, taki jak
a/b/c.py
„moduł”, tak naprawdę nie staje się nim, dopóki nie zostanie połączony z informacjami z kilku innych źródeł (np.sys.path
) W celu utworzenia obiektu modułu.(Zauważ na przykład, że dwa moduły o różnych nazwach mogą być ładowane z tego samego pliku, w zależności od
sys.path
i innych ustawień. Dokładnie tak się dzieje zpython -m my.module
następującym po nimimport my.module
interpreterem; będą dwa obiekty modułu__main__
imy.module
oba zostaną utworzone z tego samego pliku na dyskumy/module.py
).Pakiet jest modułem, który może być podmoduły (w tym podpakietów). Nie wszystkie moduły mogą to zrobić. Na przykład utwórz małą hierarchię modułów:
Upewnij się, że w obszarze nie ma innych plików
a
. Uruchom interpreterpython3 -i
języka Python 3.4 lub nowszy (np. Z ) i sprawdź wyniki następujących instrukcji:Moduły
a
ia.b
są pakietami (w rzeczywistości jest to pewien rodzaj pakietu zwany „pakietem przestrzeni nazw”, chociaż tutaj nie będziemy się tym martwić). Jednak moduła.b.c
nie jest pakietem. Możemy to zademonstrować, dodając kolejny plika/b.py
do powyższej struktury katalogów i uruchamiając świeżego interpretera:Python zapewnia, że wszystkie moduły nadrzędne zostaną załadowane przed załadowaniem modułu podrzędnego. Powyżej stwierdza, że
a/
jest to katalog, a zatem tworzy pakiet przestrzeni nazwa
, ia/b.py
jest to plik źródłowy Pythona, który ładuje i używa do utworzenia modułu (niebędącego pakietem)a.b
. W tym momencie nie możesz mieć modułu,a.b.c
ponieważa.b
nie jest on pakietem, a zatem nie możesz mieć podmodułów.Można również zobaczyć tutaj, że moduł pakietu
a
ma__path__
atrybut (pakiety muszą to mieć), ale moduł inny niż pakieta.b
nie.źródło
Późna odpowiedź, jeszcze jedna definicja:
Zatem fizycznie pakiet jest jednostką dystrybucyjną, która zapewnia jeden lub więcej modułów.
źródło
__init__.py
modułem w środku, ale jeśli mówimy o jednostkach dystrybucyjnych (zwykle za pośrednictwem PyPI), to jest to całkowicie inny rodzaj pakietu (zwykle definiowany przez istnieniesetup.py
). Uważam te dwa zastosowania tego terminu zapackage
mylące i rozmawiałem z niektórymi początkującymi w Pythonie, którzy uważają je za całkowicie oszałamiające.Pakiet jest również modułem, który może zawierać inne moduły, „proste moduły oparte na plikach i pakiety (pod-pakiet)”. Kod związany z typem pakietu modułu trafia do
__init__.py
pliku.podczas gdy moduły są prostym plikiem, który może zawierać funkcje, klasy, kod uruchamialny itp. po zaimportowaniu modułu zachowuje się jak obiekt, za pomocą którego można uzyskać dostęp do identyfikatorów zdefiniowanych w module.
źródło