質問: pythonモジュールとpythonパッケージの違いは何ですか? pythonモジュールとpythonパッケージの違いは何ですか? "package"と "module"の違いは何ですか (他の言語の場合)
回答: まず、その正確な定義では、モジュールは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にはないことがわかります。