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__.pydosya 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__.pydosya 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__.pydosya 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 .pyuzantı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__.pysadece 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__.pyaktardığı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, xmlPython standart kitaplığındaki paketi düşünün : xmldizini bir __init__.pydosya ve dört alt dizin içerir ; alt dizin etreebir __init__.pydosya ve diğerleri arasında bir ElementTree.pydosya 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 modules olduğunu söylerken yanlış olduğundan endişeliydim .
importifadeyle 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.pybasit bir deyimle içe aktarılamaz import. Kod import my-fileolarak 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.pathve 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.modulebir ile olur import my.module; iki modül nesnesi olacak __main__ve my.moduleher 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 ave a.bpaketler (aslında, "ad alanı paketi" olarak adlandırılan belirli bir paket, ancak burada bunun için endişelenmeyiz). Ancak, modül a.b.cbir paket değildir. a/b.pyYukarı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 ave 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 abir __path__niteliği olduğunu (paketlerin buna sahip olması gerekir), ancak paket dışı modülün a.bolmadığı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__.pybir 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__.pyiç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). packageKafa 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__.pydosyaya 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.