Python modülü ile Python paketi arasındaki fark nedir?
Ayrıca bkz: "paket" ve "modül" arasındaki fark nedir (diğer diller için)
__init__.py
dosya içermelidir .
from plumbum.cmd import ls
__init__.py
Python modülü ile Python paketi arasındaki fark nedir?
Ayrıca bkz: "paket" ve "modül" arasındaki fark nedir (diğer diller için)
__init__.py
dosya içermelidir .
from plumbum.cmd import ls
__init__.py
Yanıtlar:
Modül, tek bir içe aktarma altında içe aktarılan ve kullanılan tek bir dosyadır (veya dosyalar). Örneğin
import my_module
Paket, dizinlerde bir paket hiyerarşisi veren modüllerden oluşan bir koleksiyondur.
from my_package.timing.danger.internets import function_of_love
__path__
niteliği olan bir modüldür .
__init__.py
dosya kombinasyonu tarafından oluşturulur . Diğer modülleri içerebilen modüllerdir.
__path__
özniteliği olan bir Python modülüdür .
Herhangi bir Python dosyası bir modüldür , adı dosyanın .py
uzantısı olmadan temel adıdır . Bir paket Python modülleri bir koleksiyon: Bir modül tek Python dosya ise, bir paket ek içeren Python modülleri bir dizindir __init__.py
sadece Python komut bir demet barındırıyorsa bu bir dizinden bir paket ayırt etmek, dosyayı. Karşılık gelen dizinlerin kendilerine ait olması koşuluyla paketler herhangi bir derinliğe yerleştirilebilir__init__.py
dosyalarını .
Modül ve paket arasındaki farkın sadece dosya sistemi düzeyinde olduğu görülüyor. Bir modülü veya paketi içe aktardığınızda, Python tarafından oluşturulan karşılık gelen nesne her zaman türdedir module
. Ancak, bir paketi içe __init__.py
aktardığınızda , yalnızca o paketin dosyasındaki değişkenler / işlevler / sınıfların alt paketler veya modüller tarafından doğrudan görünmediğini unutmayın . Örnek olarak, xml
Python standart kitaplığındaki paketi düşünün : xml
dizini bir __init__.py
dosya ve dört alt dizin içerir ; alt dizin etree
bir __init__.py
dosya ve diğerleri arasında bir ElementTree.py
dosya içerir. Paketi / modülleri etkileşimli olarak içe aktarmaya çalıştığınızda ne olacağını görün:
>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
Python'da sys
, C ile yazılmış gibi yerleşik modüller de var , ancak sorunuzdaki bunları düşünmek istediğinizi düşünmüyorum.
module
. Bir hata ayıklayıcı yazma sürecindeyim ve hata ayıklayıcının paketlerimin module
s olduğunu söylerken yanlış olduğundan endişeliydim .
import
ifadeyle değil, yine de modül olarak içe aktarılabilir , çünkü Python tanımlayıcılarında tirelara izin verilmez. importlib.import_module()
Bunun yerine kullanın .
Gönderen Python sözlüğü :
Tüm paketlerin modül olduğunu, ancak tüm modüllerin paket olmadığını unutmayın. Ya da başka bir deyişle, paketler sadece özel bir modül türüdür. Özellikle,
__path__
öznitelik içeren herhangi bir modül bir paket olarak kabul edilir.
Adında tire işareti olan Python dosyaları, my-file.py
basit bir deyimle içe aktarılamaz import
. Kod import my-file
olarak import my - file
, bir istisna yaratacak olanla aynıdır . Bu tür dosyalar komut dosyaları olarak daha iyi karakterize edilirken, içe aktarılabilir dosyalar modüllerdir .
İlk olarak, bir modülün , kesin tanımıyla , genellikle bir veya daha fazla dosyayı diskten okuyarak oluşturulan bir Python yorumlayıcısının belleğindeki bir nesne olduğunu unutmayın . Gayri resmi olarak a/b/c.py
"modül" gibi bir disk dosyasını çağırabilsek de sys.path
, modül nesnesini oluşturmak için diğer bazı kaynaklardan (örneğin ) gelen bilgilerle birleştirilene kadar aslında bir dosya haline gelmez .
(Örneğin, diğer adlara sys.path
ve diğer ayarlara bağlı olarak farklı adlara sahip iki modülün aynı dosyadan yüklenebileceğini unutmayın. Bu tam olarak yorumlayıcıda python -m my.module
bir ile olur import my.module
; iki modül nesnesi olacak __main__
ve my.module
her ikisi de oluşturulacak diskteki aynı dosyadan my/module.py
.)
Bir paket (alt paket dahil) alt modülü sahip olabilen bir modüldür. Tüm modüller bunu yapamaz. Örnek olarak, küçük bir modül hiyerarşisi oluşturun:
$ mkdir -p a/b
$ touch a/b/c.py
Altında başka dosya olmadığından emin olun a
. Bir Python 3.4 veya üstü yorumlayıcı (örn. python3 -i
İle) başlatın ve aşağıdaki ifadelerin sonuçlarını inceleyin:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
Modüller a
ve a.b
paketler (aslında, "ad alanı paketi" olarak adlandırılan belirli bir paket, ancak burada bunun için endişelenmeyiz). Ancak, modül a.b.c
bir paket değildir. a/b.py
Yukarıdaki dizin yapısına başka bir dosya ekleyerek ve yeni bir yorumlayıcı başlatarak bunu gösterebiliriz :
import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ⇒ <module 'a' (namespace)>
a.__path__ ⇒ _NamespacePath(['/.../a'])
a.b ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'
Python, bir alt modül yüklenmeden önce tüm üst modüllerin yüklenmesini sağlar. Yukarıda a/
bir dizin olduğunu bulur ve böylece bir ad alanı paketi oluşturur a
ve bu a/b.py
, yüklediği ve (paket olmayan) bir modül oluşturmak için kullandığı bir Python kaynak dosyasıdır a.b
. Bu noktada bir modülünüz olamaz a.b.c
çünküa.b
submodules olamaz böylece bir paket değildir ve.
Burada ayrıca paket modülünün a
bir __path__
niteliği olduğunu (paketlerin buna sahip olması gerekir), ancak paket dışı modülün a.b
olmadığını görebilirsiniz.
Geç cevap, başka bir tanım:
Bir paket, bağımsız bir modül olabilen ithal edilmiş bir üst varlık veya
__init__.py
bir alt dizin yapısı içindeki bir modül grubundan üst öğe olarak özel modül ile temsil edilir.
Yani fiziksel olarak bir paket, bir veya daha fazla modül sağlayan bir dağıtım birimidir.
__init__.py
içinde modül bulunan bir dizindir , ancak dağıtım birimleri hakkında konuşursanız (genellikle PyPI aracılığıyla), bu tamamen başka bir paket türüdür (genellikle varlığı ile tanımlanır setup.py
). package
Kafa karıştırıcı terimin bu iki kullanımını buluyorum ve onu tamamen şaşkınlık içinde bulan bazı Python yeni başlayanlarla konuştum.
Paket aynı zamanda diğer modülleri, 'basit dosya tabanlı modülleri ve paketleri (alt paket)' içerebilen bir modüldür. Modülün paket tipiyle ilgili kod __init__.py
dosyaya girer .
import pack1
print(type(pack1))
modüller, bir modülü içe aktardıktan sonra, modülde tanımlanan tanımlayıcılara erişebileceğiniz bir nesne gibi davranan, fonksiyonlar, sınıflar, çalıştırılabilir kod vb. içeren basit bir dosyadır.