PythonモジュールとPythonパッケージの違いは何ですか?
参照:「パッケージ」と「モジュール」の違いは何ですか(他の言語の場合)
__init__.py
ファイルが含まれている必要があります。
from plumbum.cmd import ls
__init__.py
PythonモジュールとPythonパッケージの違いは何ですか?
参照:「パッケージ」と「モジュール」の違いは何ですか(他の言語の場合)
__init__.py
ファイルが含まれている必要があります。
from plumbum.cmd import ls
__init__.py
回答:
モジュールは、1回のインポートでインポートされて使用される単一のファイルです。例えば
import my_module
パッケージは、パッケージ階層を提供するディレクトリ内のモジュールのコレクションです。
from my_package.timing.danger.internets import function_of_love
__path__
属性を持つモジュールにすぎません。
__init__.py
ファイルの組み合わせによって形成されます。それらは他のモジュールを含むことができるモジュールです。
__path__
属性を持つPythonモジュールです。
Pythonファイルはすべてモジュールであり、その名前は.py
拡張子なしのファイルのベース名です。パッケージには、 Pythonモジュールのコレクションです:モジュールは、単一のPythonのファイルがある一方で、パッケージが追加含むPythonモジュールのディレクトリである__init__.py
だけでPythonスクリプトの束を含むように起こるのディレクトリからパッケージを区別するために、ファイルを。対応するディレクトリに独自のパッケージが含まれている場合、パッケージは任意の深さにネストできます__init__.py
ファイルます。
モジュールとパッケージの違いは、ファイルシステムレベルでのみ保持されているようです。モジュールまたはパッケージをインポートする場合、Pythonによって作成された対応するオブジェクトは常にタイプmodule
です。ただし、パッケージをインポートすると__init__.py
、そのパッケージのファイル内の変数/関数/クラスのみが直接表示され、サブパッケージやモジュールは表示されないことに注意してください。例として、xml
Python標準ライブラリのパッケージを考えます。そのxml
ディレクトリには__init__.py
ファイルと4つのサブディレクトリが含まれています。サブディレクトリetree
には__init__.py
ファイルと、特にファイルが含まれていElementTree.py
ます。パッケージ/モジュールをインタラクティブにインポートしようとするとどうなるか見てください:
>>> 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にはsys
、Cなどで作成されたなどの組み込みモジュールもありますが、質問でそれらを考慮するつもりはないと思います。
module
。私はデバッガを書いている最中ですが、自分のパッケージがmodule
s であると私のデバッガが間違っていると心配していました。
import
Python識別子ではダッシュを使用できないため、通常のステートメントではなく、モジュールとしてインポートできます。importlib.import_module()
代わりに使用してください。
Python用語集から:
すべてのパッケージがモジュールであることを覚えておくことが重要ですが、すべてのモジュールがパッケージであるとは限りません。言い換えれば、パッケージは特別な種類のモジュールにすぎません。具体的には、
__path__
属性を含むモジュールはパッケージと見なされます。
のようmy-file.py
に名前にダッシュが含まれるPythonファイルは、単純なimport
ステートメントではインポートできません。コード的にimport my-file
はimport my - file
、例外が発生するのと同じです。そのようなファイルはスクリプトとしてよりよく特徴付けられますが、インポート可能なファイルはモジュールです。
まず、正確な定義では、モジュールはPythonインタープリターのメモリー内のオブジェクトであり、ディスクから1つ以上のファイルを読み取ることによって作成されることが多いことに注意してください。非公式にa/b/c.py
「モジュール」などのディスクファイルを呼び出すこともありsys.path
ますが、モジュールオブジェクトを作成するために他のいくつかのソース(など)からの情報と組み合わせるまで、実際には1つにはなりません。
(たとえば、sys.path
他の設定に応じて、異なる名前の2つのモジュールを同じファイルからロードできることに注意してください。これは、インタープリター内のがpython -m my.module
後に続くものとまったく同じimport my.module
です。2つのモジュールオブジェクト__main__
とmy.module
が作成され、どちらも作成されます。ディスク上の同じファイルからmy/module.py
。)
パッケージは、(サブパッケージを含む)サブモジュールを有することができるモジュールです。すべてのモジュールがこれを実行できるわけではありません。例として、小さなモジュール階層を作成します。
$ mkdir -p a/b
$ touch a/b/c.py
の下に他のファイルがないことを確認しますa
。Python 3.4以降のインタプリタを(たとえばでpython3 -i
)起動し、次のステートメントの結果を調べます。
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'>
モジュールa
とa.b
はパッケージです(実際には、「名前空間パッケージ」と呼ばれる特定の種類のパッケージですが、ここでは心配しません)。ただし、モジュールa.b.c
はパッケージではありません。a/b.py
上記のディレクトリ構造に別のファイルを追加し、新しいインタープリターを開始することで、これを実証できます。
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は、子モジュールがロードされる前に、すべての親モジュールがロードされることを保証します。その上それが見つかったa/
ディレクトリで、その名前空間のパッケージを作成しa
、それはa/b.py
それの負荷や用途が(非パッケージ)モジュールを作成するためのPythonのソースファイルですa.b
。この時点では、モジュールはできませんa.b.c
のでをa.b
では、はパッケージではないはできず、したがってサブモジュールを持つことはできません。
また、パッケージモジュールa
には__path__
属性があります(パッケージにはこれが必要です)が、非パッケージモジュールにa.b
はないこともわかります。
遅い答え、さらに別の定義:
パッケージは、インポートされたトップエンティティによって表されます。これは、自己完結型モジュールか、
__init__.py
サブディレクトリ構造内のモジュールセットからのトップエンティティとしての特別なモジュールのいずれかです。
したがって、物理的にはパッケージは配布ユニットであり、1つ以上のモジュールを提供します。
__init__.py
内部にモジュールがあるディレクトリですが、(通常PyPIを介して)ディストリビューションユニットについて話す場合、これは完全に別のタイプのパッケージです(通常はの存在によって定義されsetup.py
ます)。私はこの2つの用語の使い方がわかりpackage
にくいので、Pythonの初心者がまったく困惑していると話しました。