__init__.py은 (는) 무엇 이죠?


답변:


1453

패키지의 필수 부분이되었습니다 ( 이전 3.3+ "네임 스페이스 패키지"가 아닌 3.3 이전 "일반 패키지" ).

여기 문서가 있습니다.

파이썬은 일반 패키지와 네임 스페이스 패키지라는 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 Python 3.2 및 이전 버전에 존재했던 기존 패키지입니다. 일반 패키지는 일반적으로 __init__.py파일을 포함하는 디렉토리로 구현됩니다 . 일반 패키지를 가져 오면이 __init__.py파일이 내재적으로 실행되고 정의 된 객체가 패키지 네임 스페이스의 이름에 바인딩됩니다. __init__.py파일은 다른 모듈을 포함 할 수있는 동일한 파이썬 코드를 포함 할 수 있으며 가져올 때 파이썬 모듈에 몇 가지 추가 속성을 추가합니다.

그러나 링크를 클릭하면 예제, 추가 정보 및 네임 스페이스 패키지에 대한 설명, 패키지가없는 종류가 포함됩니다 __init__.py.


187
이것은 "문자열과 같은 일반적인 이름을 가진 디렉토리가 나중에 모듈 검색 경로에서 발생하는 유효한 모듈을 실수로 숨기지 않도록하기 위해 수행되는 것"입니까?
Carl G

97
@CarlG Python 은 디렉토리 목록을 검색하여 이름을 확인합니다 (예 : import 문). 이들은 임의의 디렉토리가 될 수 있고 최종 사용자가 임의의 디렉토리를 추가 할 수 있기 때문에 개발자는 docs 예제의 'string'과 같은 유효한 Python 모듈과 이름을 공유하는 디렉토리에 대해 걱정해야합니다. 이를 줄이기 위해 공백이 있더라도 _ _ init _ _.py (공백 없음)라는 파일이없는 디렉토리는 무시합니다.
2 비트 연금술사

186
@CarlG 이것을보십시오. 'datetime'이라는 디렉토리를 만들고 init.py 파일 (밑줄 포함)과 datetime.py라는 두 개의 빈 파일을 만듭니다. 이제 인터프리터, import sys 및 issue를 열어 sys.path.insert(0, '/path/to/datetime')해당 경로를 방금 만든 디렉토리의 경로로 바꿉니다. 이제 같은 것을 시도하십시오 from datetime import datetime;datetime.now(). 이제 빈 파일을 가져 오기 때문에 AttributeError가 발생합니다. 빈 init 파일을 작성하지 않고이 단계를 반복하면 이런 일이 발생하지 않습니다. 그것이 예방하려는 의도입니다.
2 비트 연금술사

4
@ DarekNędza Python 인터프리터를 열 수없고 from datetime import datetime오류없이 문제 가 발생 하면 잘못 설정 한 것입니다 . 버전 2.3으로 돌아가는 것이 좋습니다!
2 비트 연금술사

5
@SWang : 틀린 예 : builtins내장 모듈이 아닌 내장 함수클래스를 나열 합니다 ( docs.python.org/3/tutorial/modules.html#the-dir-function 참조 ). 당신이 목록에 원하는 경우 내장 된 모듈을 수행 import sys; print(sys.builtin_module_names)(참조 docs.python.org/3/library/sys.html#sys.builtin_module_names을 ).
Maggyero

842

명명 된 파일 __init__.py은 디스크의 디렉토리를 Python 패키지 디렉토리로 표시하는 데 사용됩니다. 파일이 있다면

mydir/spam/__init__.py
mydir/spam/module.py

mydir경로에, 당신의 코드를 가져올 수 module.py등을

import spam.module

또는

from spam import module

__init__.py파일 을 제거하면 Python은 더 이상 해당 디렉토리에서 하위 모듈을 찾지 않으므로 모듈 가져 오기 시도가 실패합니다.

__init__.py파일은 일반적으로 비어 있지만, 위의 예제 감안할 등을보다 편리 이름, 홀드 편의 기능에 따라 패키지의 선택된 부분을 수출하는 데 사용할 수 있습니다, 초기화 모듈의 내용은 다음과 같이 액세스 할 수 있습니다

import spam

이것을 기반으로


96
업데이트 : 파일 __init__.py은 Python 2.X에서 필요했으며 여전히 Python 2.7.12 (필자는 테스트)에서 필요하지만 더 이상 (필수적으로) Python 3.3 이상에서는 필요하지 않으며 Python 3.4.3에서는 필요하지 않습니다 (I 그것을 테스트). 자세한 내용은 stackoverflow.com/questions/37139786 을 참조하십시오.
Rob_before_edits

4
사용하지 마십시오. 일반 패키지가 아니라 "네임 스페이스"패키지입니다. 네임 스페이스 패키지는 매우 드문 사용 사례에 사용됩니다. 사용할 때 알 필요가 없습니다. 그냥 사용하십시오 __init__.py.
메탄

2
그러나 가지고 setup.py있고 사용 find_packages()하는 경우 __init__.py모든 디렉토리 에 있어야 합니다. 참조 stackoverflow.com/a/56277323/7127824을
techkuz

484

파이썬 패키지와 디렉토리를 라벨 및 정의뿐만 아니라 __all__, __init__.py패키지 수준에서 어떤 변수를 정의 할 수 있습니다. 패키지가 API와 같은 방식으로 자주 가져올 항목을 정의하는 경우 편리합니다. 이 패턴은 Pythonic "평면이 중첩보다 낫다"라는 철학을 고수합니다.

다음은 내 프로젝트 중 하나의 예입니다 . 데이터베이스와 상호 작용하기 위해 자주 sessionmaker호출 Session을 가져옵니다 . 몇 가지 모듈로 "데이터베이스"패키지를 작성했습니다.

database/
    __init__.py
    schema.py
    insertions.py
    queries.py

__init__.py코드는 다음과 같습니다.

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

Session여기에서 정의 했으므로 아래 구문을 사용하여 새 세션을 시작할 수 있습니다. 이 코드는 "데이터베이스"패키지 디렉토리 내부 또는 외부에서 동일하게 실행됩니다.

from database import Session
session = Session()

물론 이것은 작은 편의성입니다. 대안은 Session데이터베이스 패키지의 "create_session.py"와 같은 새 파일에서 정의하고 다음 을 사용하여 새 세션을 시작하는 것입니다.

from database.create_session import Session
session = Session()

추가 자료

여기에 적절한 용도를 다루는 꽤 흥미로운 레딧 스레드가 __init__.py있습니다.

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

대다수의 견해 __init__.py는 "명시적인 것이 암시적인 것보다 낫다"는 철학을 위반하지 않도록 파일이 매우 얇아 야 한다는 것 같습니다 .


3
engine, sessionmaker, create_engine, 및 os모든도에서 가져올 수 있습니다 database당신이 네임 스페이스의 엉망으로 만든 것 같은 ... 지금 보인다.
ArtOfWarfare

9
@ArtOfWarfare에서로 __all__ = [...]가져올 항목을 제한하는 데 사용할 수 있습니다 import *. 그러나 그 외에도, 최상위 수준의 네임 스페이스가 남아 있습니다.
Nathan Gould

'DATABASE URL'이 무엇인지 알 수 있습니까? create_engine을 'mysql + mysqldb : // root : python @ localhost : 3306 / test'로 묶어 복제하려고 시도했지만 작동하지 않습니다. 감사.
SunnyBoiz

2
quieries.py 패키지 내부 에서 init에 정의 된 '세션'클래스에 어떻게 액세스 하시겠습니까?
vldbnc

252

두 가지 주요 이유가 있습니다 __init__.py

  1. 편의상 : 다른 사용자는 패키지 계층에서 함수의 정확한 위치를 알 필요가 없습니다.

    your_package/
      __init__.py
      file1.py
      file2.py
        ...
      fileN.py
    # in __init__.py
    from file1 import *
    from file2 import *
    ...
    from fileN import *
    # in file1.py
    def add():
        pass

    그런 다음 다른 사람들이 add ()를 호출하여

    from your_package import add

    file1을 모른 채

    from your_package.file1 import add
  2. 무언가를 초기화하고 싶다면; 예를 들어, 로깅 (최상위 레벨에 배치해야 함) :

    import logging.config
    logging.config.dictConfig(Your_logging_config)

7
오, 대답을 읽기 전에 해당 위치에서 명시 적으로 함수를 호출하는 것이 좋습니다.
Aerin

2
@ Aerin 짧은 진술 (이 경우 주관적인 결론)을 항상 참으로 생각하지 않는 것이 좋습니다. 에서 가져 오기 __init__.py가 유용한 경우도 있지만 항상 그런 것은 아닙니다.
Tobias Sette

2
이 코드는 가져 오기 시간이나 런타임에 실행됩니까?
user1559897

111

__init__.py파일은 파이썬이 그것을 포함하는 디렉토리를 모듈로 취급하게합니다.

또한이 파일은 모듈에 첫 번째로로드되는 파일이므로 모듈을로드 할 때마다 실행할 코드를 실행하거나 내보낼 하위 모듈을 지정할 수 있습니다.


89

Python 3.3부터는 __init__.py더 이상 디렉토리를 가져 오기 가능한 Python 패키지로 정의 할 필요가 없습니다.

확인 PEP 420 : 암시 적 네임 스페이스 패키지 :

필요하지 않은 패키지 디렉토리에 대한 기본 지원 __init__.py마커 파일을 자동으로 여러 경로 세그먼트를 확장 할 수 (에 설명 된대로 다양한 타사에서 영감는 네임 스페이스 패키지에 접근 PEP 420 )

테스트는 다음과 같습니다.

$ mkdir -p /tmp/test_init
$ touch /tmp/test_init/module.py /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
├── module.py
└── __init__.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

$ rm -f /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
└── module.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

참조 :
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
은 __init__입니다. Python 3의 패키지에는 py가 필요하지 않습니까?


3
"네임 스페이스"패키지입니다. 일반 패키지에는 사용하지 마십시오.
메탄

@ methan, 귀하의 의견에 대해 자세히 설명해 주시겠습니까?
Robert Lugg


57

파이썬에서 패키지의 정의는 매우 간단합니다. Java와 마찬가지로 계층 구조와 디렉토리 구조는 동일합니다. 그러나 당신은 __init__.py패키지 에 있어야 합니다. __init__.py아래 예제를 통해 파일을 설명 하겠습니다.

package_x/
|--  __init__.py
|--    subPackage_a/
|------  __init__.py
|------  module_m1.py
|--    subPackage_b/
|------  __init__.py
|------  module_n1.py
|------  module_n2.py
|------  module_n3.py

__init__.py존재하는 한 비어있을 수 있습니다. 디렉토리가 패키지로 간주되어야 함을 나타냅니다. 물론 __init__.py적절한 콘텐츠를 설정할 수도 있습니다.

module_n1에 함수를 추가하면 :

def function_X():
    print "function_X in module_n1"
    return

실행 후 :

>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()

function_X in module_n1 

그런 다음 계층 구조 패키지를 따르고 함수를 module_n1이라고했습니다. __init__.pysubPackage_b에서 다음과 같이 사용할 수 있습니다 :

__all__ = ['module_n2', 'module_n3']

실행 후 :

>>>from package_x.subPackage_b import * 
>>>module_n1.function_X()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_n1

따라서 * 가져 오기를 사용하면 모듈 패키지에 __init__.py내용 이 적용됩니다 .


setup.py는 패키지 라이브러리를 통해 동일한 가져 오기를 어떻게 수행합니까? from package_x.subPackage_b.module_n1 import function_X
technazi

여기서 중요한 점은 "* 가져 오기 사용, 모듈 패키지는 init .py 콘텐츠에 적용됩니다 "
Minnie

54

파이썬은 __init__.py파일 없이 작동하지만 여전히 파일을 포함해야합니다.

패키지가 모듈로 취급되도록 지정하므로 비어있는 경우에도 포함하십시오.

실제로 __init__.py파일을 사용할 수도 있습니다.

다음과 같은 파일 구조가 있다고 가정하십시오.

main_methods 
    |- methods.py

그리고 methods.py이것을 포함 :

def foo():
    return 'foo'

사용하려면 foo()다음 중 하나가 필요합니다.

from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()

어쩌면 methods.py내부 에 보관해야 할 (또는 원하는) main_methods런타임 (예 : 런타임 / 종속성)이 필요합니다 main_methods.


당신의 이름을 변경 한 경우 methods.py__init__.py당신은 사용할 수 있습니다 foo()만 가져 main_methods:

import main_methods
print(main_methods.foo()) # Prints 'foo'

이것은 __init__.py패키지의 일부로 취급 되기 때문에 작동 합니다.


일부 파이썬 패키지는 실제로 이것을 수행합니다. 예제는 JSON 이며, 여기서 running import json은 실제로 패키지 __init__.py에서 가져 옵니다 json( 여기에서 패키지 파일 구조 참조 ).

소스 코드: Lib/json/__init__.py


39

__init__.py 디렉토리를로드 가능한 모듈로 취급합니다.

코드 읽기를 선호하는 사람들을 위해 Two-Bit Alchemist의 의견을 여기에 넣습니다 .

$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$ 
$ rm /tmp/mydir/spam/__init__.py*
$ 
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>> 

30

다른 파이썬 파일을 쉽게 가져올 수 있습니다. 이 파일을 다른 py 파일이 들어있는 디렉토리 (예 : stuff)에 넣으면 import stuff.other와 같은 것을 할 수 있습니다.

root\
    stuff\
         other.py

    morestuff\
         another.py

__init__.py파이썬은 디렉토리 소스 내부에 없으면 소스의 소스 코드가 어디에 있는지 알지 못하고 패키지로 인식 할 수 없기 때문에 other.py를 가져올 수 없습니다.


2
내 프로젝트 (파이썬 3.4)에서 동일한 구조를 가지고 있지만 another.py가 other.py를 볼 수 없습니다. 가져 오기는 어떻게합니까? root.stuff에서 다른 수입? VSCode 디버그 모드에서는 작동하지만 명령 줄에서는 작동하지 않습니다. 어떤 아이디어?
rodrigorf

10

__init__.py파일을 쉽게 수입을합니다. __init__.py패키지 내에가 존재 하면 다음과 같이 a()파일에서 함수 를 가져올 수 있습니다 b.py.

from b import a

그러나 이것이 없으면 직접 가져올 수 없습니다. 시스템 경로를 수정해야합니다.

import sys
sys.path.insert(0, 'path/to/b.py')

from b import a

" b.py 파일에서 함수 a ()를 가져올 수 있음 을 의미 합니다. [snippet] 그렇지 않으면 직접 가져올 수 없습니다. "? __init__.py없이 b.py 파일에서 a () 함수를 가져올 수 있습니다.
aderchox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.