파이썬 모듈과 파이썬 패키지의 차이점은 무엇입니까?
참조 : “패키지”와 “모듈”의 차이점은 무엇입니까 (기타 언어)
답변
모듈은 하나의 가져 오기에서 가져 와서 사용되는 단일 파일입니다. 예 :
import my_module
패키지는 패키지 계층 구조를 제공하는 디렉토리의 모듈 모음입니다.
from my_package.timing.danger.internets import function_of_love
답변
모든 파이썬 파일은 모듈 이며 .py
확장자가 없는 파일의 기본 이름 입니다. 패키지는 파이썬 모듈의 모음입니다 : 모듈이 하나의 파이썬 파일 인 반면, 패키지가 추가로 포함하는 파이썬 모듈의 디렉토리입니다 __init__.py
파이썬 스크립트의 무리를 포함 할 일이 디렉토리에서 패키지를 구분하기 위해, 파일을. 해당 디렉토리에 자체 __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>
파이썬에는 sys
C로 작성된 내장 모듈도 있지만 질문에 모듈 을 고려할 생각은 아닙니다.
답변
로부터 파이썬 용어 :
모든 패키지는 모듈이지만 모든 모듈이 패키지는 아님을 명심해야합니다. 다시 말하면 패키지는 특별한 종류의 모듈입니다. 특히
__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'>
모듈 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__'
파이썬은 자식 모듈이로드되기 전에 모든 부모 모듈이로드되도록합니다. 찾은보다도 그 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))
모듈은 모듈을 가져온 후 함수, 클래스, 실행 가능한 코드 등을 포함 할 수있는 간단한 파일이며 모듈에 정의 된 식별자에 액세스 할 수있는 객체처럼 동작합니다.