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


576

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

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


9
나는 틀릴 수도 있지만 나를 위해 : 모듈은 기본적으로 하나의 파이썬 파일입니다. 패키지는 많은 모듈 (파이썬 파일)이있는 폴더입니다.
lc2817

36
패키지로 간주 되려면 해당 폴더에 __init__.py파일이 있어야합니다 .
Giulio Piancastelli

@ lc2817 : 가장 일반적인 경우이지만 파일 시스템에서 모듈을로드 할 필요는 없습니다. 예 : 구현 참조from plumbum.cmd import ls
jfs


커뮤니티는 Python 패키지와 PyPI / wheels / etc와 같은 Python 구성 요소를 배포하는 데 사용되는 패키지를 어떻게 차별화합니까? 이 둘은 나에게 "패키지"라는 단어를 다르게 적용한 것 같습니다.
davidA

답변:


373

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

import my_module

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

from my_package.timing.danger.internets import function_of_love

모듈 설명서

패키지 소개


54
"모듈이 하나의 가져 오기에서 가져 오는 단일 파일 (또는 파일)입니다"라고 말할 때 모듈이 둘 이상의 파일 인 상황을 설명 할 수 있습니까? 아니면 내가 무슨 뜻인지 잘못 읽고 있습니까?
사용자

5
모듈을 만드는 데 파일이 필요하지 않습니다. 예를 들어 zip 파일에서 모듈을 가져올 수 있습니다. 패키지와 동일합니다. 파이썬에는 모듈 / 패키지에 대한 클래스가 하나만 있습니다. 패키지는 __path__속성이 있는 모듈 일뿐 입니다.
jfs

33
패키지 도 모듈 입니다. 그것들은 다르게 포장되어 있습니다. 디렉토리와 __init__.py파일 의 조합으로 구성됩니다 . 다른 모듈을 포함 할 수있는 모듈입니다.
Martijn Pieters

15
@Jacquot 는 참조 문서 의 가져 오기 시스템 을 참조하십시오 . 모든 패키지는 모듈이라는 점을 명심해야합니다 .
Martijn Pieters

6
@Jacquot : 및 “package”에 대한 용어 : 하위 모듈을 포함하거나 재귀 적으로 하위 패키지를 포함 할 수있는 Python 모듈. 기술적으로 패키지는 __path__속성을 가진 파이썬 모듈입니다 .
Martijn Pieters

556

모든 파이썬 파일은 모듈 이며 .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로 작성된 내장 모듈도 있지만 질문에 모듈 을 고려할 생각은 아닙니다.


9
파이썬이 만든 해당 객체는 항상 유형이라는 것을 명시 적으로 언급 해 주셔서 감사합니다 module. 디버거를 작성하는 과정에 있으며 내 패키지가 modules 라고 말하는 데 내 디버거가 잘못되었다고 걱정했습니다 .
ArtOfWarfare

8
@jolvi 대시를 포함하는 파일 이름을 가진 Python 파일은 일반 import식별자가 아닌 모듈로 가져올 수 있습니다 . 파이썬 식별자에는 대시가 허용되지 않기 때문입니다. importlib.import_module()대신 사용하십시오 .
Giulio Piancastelli 2016 년

2
@jolvi 아니에요. 내 의견에서 당신은 그것을 읽고 있습니까? 그냥 이름에 대시가있는 파이썬 파일이 있거나 우연히 만난다면 여전히 모듈로 가져올 수 있다고 말하고 있습니다. 파이썬 파일의 이름을 지정하는 기본 방법에 대해서는 언급하지 않습니다. 나는 당신이 다른 곳에서 그것을 찾을 수 있다고 확신합니다 : 일반적으로 밑줄을 선호하는 대시를 피하는 것이 좋습니다.
Giulio Piancastelli

3
Python을 처음 사용하기 때문에 부모 패키지를 가져올 때 기본적으로 하위 패키지 또는 모듈을 사용할 수 없기 때문에 걸려 넘어졌습니다. 특별한 이유가 있습니까? 부모 패키지를 가져올 때 하위 패키지 또는 모듈을 정규화 된 이름으로 사용 가능 하게 만드는 일반적인 패턴이 있습니까?
sschuberth

2
@sschuberth 부모 패키지의 init .py 에서 하위 패키지를 가져 오기만하면 됩니다.
Anna

33

로부터 파이썬 용어 :

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

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


23

먼저, 정확한 정의에서 모듈 은 파이썬 인터프리터 메모리의 객체이며 종종 디스크에서 하나 이상의 파일을 읽음으로써 생성됩니다. 비공식적 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에는없는 속성도 있습니다.


1
아직 그렇지 않은 경우 돌아가서이 답변의 예를 살펴보십시오.
Donal Lafferty

2

늦은 답변, 또 다른 정의 :

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

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


1
파이썬 에는 패키지 에 대한 두 가지 정의 가 있으며 서로 다릅니다. 당신의 대답은 그것들을 함께 결합한 것 같습니다. 엄밀히 말하면, 파이썬 패키지는 __init__.py내부 에 모듈 이있는 디렉토리 이지만 배포 단위 (일반적으로 PyPI를 통해)에 대해 이야기하는 경우 이것은 완전히 다른 유형의 패키지입니다 (일반적으로의 존재에 의해 정의 됨 setup.py). 나는이 두 가지 용어가 package혼동되는 것을 발견하고, 완전히 어리둥절한 파이썬 초보자들과 이야기를 나 ve습니다.
davidA

@ davidA, 그것은 단지 당신이 느끼는 방법이 아닙니다. 포장 되었습니다 : packaging.python.org/glossary/#term-distribution-package (명확하게 감사합니다!)
Lorem Ipsum

0

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

import pack1
print(type(pack1))

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.