[python] 파이썬 모듈과 파이썬 패키지의 차이점은 무엇입니까?

파이썬 모듈과 파이썬 패키지의 차이점은 무엇입니까?

참조 : “패키지”와 “모듈”의 차이점은 무엇입니까 (기타 언어)



답변

모듈은 하나의 가져 오기에서 가져 와서 사용되는 단일 파일입니다. 예 :

import my_module

패키지는 패키지 계층 구조를 제공하는 디렉토리의 모듈 모음입니다.

from my_package.timing.danger.internets import function_of_love

모듈 설명서

패키지 소개


답변

모든 파이썬 파일은 모듈 이며 .py확장자가 없는 파일의 기본 이름 입니다. 패키지는 파이썬 모듈의 모음입니다 : 모듈이 하나의 파이썬 파일 인 반면, 패키지가 추가로 포함하는 파이썬 모듈의 디렉토리입니다 __init__.py파이썬 스크립트의 무리를 포함 할 일이 디렉토리에서 패키지를 구분하기 위해, 파일을. 해당 디렉토리에 자체 __init__.py파일이 포함되어 있으면 패키지를 깊이에 중첩시킬 수 있습니다 .

모듈과 패키지의 차이점은 파일 시스템 수준에서 유지되는 것 같습니다. 모듈이나 패키지를 가져올 때 Python에서 만든 해당 객체는 항상 유형 module입니다. 그러나 패키지를 가져올 때 __init__.py해당 패키지 파일의 변수 / 함수 / 클래스 만 하위 패키지 나 모듈이 아닌 직접 볼 수 있습니다 . 예를 들어, xmlPython 표준 라이브러리 의 패키지를 생각해보십시오 . 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>

파이썬에는 sysC로 작성된 내장 모듈도 있지만 질문에 모듈 을 고려할 생각은 아닙니다.


답변

로부터 파이썬 용어 :

모든 패키지는 모듈이지만 모든 모듈이 패키지는 아님을 명심해야합니다. 다시 말하면 패키지는 특별한 종류의 모듈입니다. 특히 __path__속성이 포함 된 모든 모듈 은 패키지로 간주됩니다.

와 같이 이름에 대시가있는 Python 파일 my-file.py은 간단한 import명령문 으로 가져올 수 없습니다 . 코드 단위 로 예외를 발생 import my-file시키는 것과 동일 import my - file합니다. 이러한 파일은 스크립트 로 더 잘 특성화되며 가져 오기 가능한 파일은 모듈 입니다.


답변

먼저, 정확한 정의에서 모듈 은 파이썬 인터프리터 메모리의 객체이며 종종 디스크에서 하나 이상의 파일을 읽음으로써 생성됩니다. 비공식적 a/b/c.py으로 “모듈” 과 같은 디스크 파일을 호출 할 수 있지만 실제로는 여러 다른 소스 (예 : 등 sys.path)의 정보와 결합되어 모듈 객체를 생성 할 때까지 실제로는 하나가되지 않습니다 .

(참고, 예를 들어, 이름이 다른 두 개의 모듈에 따라 동일한 파일에서로드 할 수 있습니다 sys.path.이와 어떻게 정확히 무엇이며, 기타 설정 python -m my.module다음에 import my.module두 개의 모듈 개체가있을 것이다; 인터프리터 __main__my.module두 만들어 디스크의 동일한 파일에서 my/module.py.)

패키지 (하위 패키지 포함) 서브 모듈을 가질 수있는 모듈이다. 모든 모듈이이를 수행 할 수있는 것은 아닙니다. 예를 들어 작은 모듈 계층을 만듭니다.

$ mkdir -p a/b
$ touch a/b/c.py

아래에 다른 파일이 없는지 확인하십시오 a. Python 3.4 이상의 인터프리터를 시작하고 (예 : with 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'>

모듈 aa.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__'

파이썬은 자식 모듈이로드되기 전에 모든 부모 모듈이로드되도록합니다. 찾은보다도 그 a/디렉토리이기 때문에 네임 스페이스 패키지를 생성 a하고, 그 a/b.py그것을로드 및 사용이 (비 패키지) 모듈을 만들 수있는 파이썬 소스 파일입니다 a.b. 이 시점 에서 패키지가 아니기 a.b.c때문에 모듈을 a.b가질 수 없으므로 하위 모듈을 가질 수 없습니다.

패키지 모듈 a에는 __path__속성이 있지만 (패키지에는 반드시 있어야 함) 비 패키지 모듈 a.b에는없는 속성도 있습니다.


답변

늦은 답변, 또 다른 정의 :

패키지는 자체 포함 된 모듈이거나 __init__.py하위 디렉토리 구조 내의 모듈 세트에서 최상위 엔티티로서 특수 모듈 일 수있는 가져온 최상위 엔티티로 표시됩니다 .

따라서 실제로 패키지는 하나 이상의 모듈을 제공하는 배포 장치입니다.


답변

패키지는 또한 다른 모듈, ‘간단한 파일 기반 모듈 및 패키지 (하위 패키지)’를 포함 할 수있는 모듈입니다. 패키지 유형의 모듈과 관련된 코드가 __init__.py파일에 들어갑니다 .

import pack1
print(type(pack1))

모듈은 모듈을 가져온 후 함수, 클래스, 실행 가능한 코드 등을 포함 할 수있는 간단한 파일이며 모듈에 정의 된 식별자에 액세스 할 수있는 객체처럼 동작합니다.


답변