__init__.py의 용도는 무엇인가요?

파이썬 소스 디렉터리에서 __init__.py의 용도는 무엇인가요?

질문에 대한 의견 (2)
해결책

이전에는 패키지(최신 3.3+ 네임스페이스 패키지가 아닌 [이전, 3.3 이전 (https://docs.python.org/3/reference/import.html#regular-packages))의 필수 부분이었음)의 일부였습니다.

여기 문서가 있습니다.

파이썬은 일반 패키지와 네임스페이스 패키지의 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 파이썬 3.2 이전 버전에 존재했던 전통적인 패키지입니다. 일반 패키지는 일반적으로 __init__.py 파일을 포함하는 디렉터리로 구현됩니다. 일반 패키지를 임포트하면 이 __init__.py 파일이 암시적으로 실행되고, 이 파일이 정의하는 객체는 패키지의 네임스페이스에 있는 이름에 바인딩됩니다. 이 __init__.py 파일에는 다른 모듈과 동일한 파이썬 코드가 포함될 수 있으며, 파이썬은 모듈을 임포트할 때 모듈에 몇 가지 추가 어트리뷰트를 추가합니다.

링크를 클릭하면 __init__.py가 없는 네임스페이스 패키지에 대한 예제, 자세한 정보 및 설명이 포함되어 있습니다.

해설 (20)

파일 이름이 'init.py' 의 파이썬 패키지 디렉터리용 디렉터리용 backup-to-disk 표시하는 데 사용됩니다. 파일의 경우

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

당신의 길을 '와' 미디르 켜있을 가져올 수 있는 코드를 'module.py' 으로

import spam.module

또는

from spam import module

분리하십시오 init.py '가 더 이상' 의 경우 파일, 디렉터리 안에 있는 서브 모듈 Python 이 모듈에서는 가져오기할 포착하십시오 도왔으매 시도_횟수 페일오버합니다.

이 파일은 일반적으로 사용할 수 있지만, '빈' init.py 내보내기할 선택함 구간들을 보다 편리한 패키지 이름 아래에 실시, 편의 기능을 상술합니다. 위의 예를 볼 때 콘텐트입니다 https://learning. init 모듈에서는 있다

import spam

따라

해설 (3)

파이썬 패키지 ',' 로 정의하고 all 레이블링을 디렉터리입니다 외에 '모든 변수를 정의할 수 있습니다 ' init.py http://support. 숨겨요 level. 언로드하기 편리한 경우가 자주 있는 경우 패키지로의 eventtest 생각하신거야 가져오기됨 같은 apiu 열었다. 이 패턴은 준수, 파이썬, 균등형 있는 것보다 더 나은 nested&quot &quot 장려한다. 철학.

예를 들어, # # 이 중 하나를 예로 든 내 프로젝트 ',' 내가 자주 임포트합니다 제시온메이커 상호 작용할 수 있는 '세션' 라는 내 데이터베이스. 내가 쓴 《 &quot database"; 몇 번의 패키지로의 모듈:

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)

하도 '정의' here, I can 세션용으로 다음 구문을 사용하여 새로운 세션을 시작할 수 있습니다. 이 코드는 약간만이라도 내부나 외부에서 동일한 실행됨을 &quot database"; 패키지 디렉터리입니다.

from database import Session
session = Session()

물론 이렇게 좁은 편리함 - 세션 '에서' 새로운 파일 같은 다른 약간만이라도 정의하십시오 &quot create_session.py"; 내 패키지의 데이터베이스를 사용하여 세션 시작.

from database.create_session import Session
session = Session()

# 기업에서든 판독값

꽤 적절한 사용하는 'here' init.py 다루는 흥미로운 레딧 스레드할 있습니다.

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

대부분의 init.py 한다는 의견이 있는 것 같다 '' 파일을 피하기 위해 매우 얇은 위반, 명시성 &quot implicit&quot 것보다 낫다. 철학.

해설 (4)

Init.py '' 두 가지 주요 원인

  1. 편의상: 다른 사용자가 functions& # 39 를 알아야 할 필요는 없다. 정확한 위치에 너회의 패키지로의 계층.

"' your_package/ init.py file1.py file2.py . fileN.py "'

"'

init.py

  • 충스러웠으니 file1 가져오기의
  • 충스러웠으니 file2 가져오기의 .
  • 충스러웠으니 피렌 가져오기의 "'

"'

in file1.py

데프 추가 (): 패스 "'

다른 () 에 추가 호출할 수 있습니다 다음

your_package 가져오기의 에서 추가

같은 file1 모른 채,

your_package.file1 가져오기의 에서 추가

  1. 스케쳐내 something to be 초기화되었습니다. 예를 들어 로깅 (넣을 하는 top level):

조지 g. 콘피그 임포트합니다 조지 g. 콘피g. 딕트콘피그 (Your_logging_config)

해설 (1)

init__.py` 파일은 파이썬이 이 파일이 포함된 디렉터리를 모듈로 취급하도록 합니다.

또한 이 파일은 모듈에서 가장 먼저 로드되는 파일이므로 모듈이 로드될 때마다 실행하려는 코드를 실행하거나 내보낼 하위 모듈을 지정하는 데 사용할 수 있습니다.

해설 (0)

이후 더 이상 필요하지 않은 것처럼 ',' init.py 파이썬 3.3tb 정의하십시오 디렉터리용 수입할 수 있는 파이썬 패키지.

확인란 [PEP 420. 암시적입니다 이름공간이 패키지] [1]:

&gt. 기본으로 지원하는 패키지 디렉터리용 init.py 필요하지 않은 '수' 표시자가 파일과 자동으로 스팬합니다 다중 경로 세그먼트만 (영감을 받은 다양한 제 3 자 접근 방법을 설명한 대로 이름공간이 패키지를 PEP 420)

[1]: https://docs.python.org/3/whatsnew/3.3.html # pep 420 암시적입니다 이름공간이 패키지

39 의 here& 테스트:

$ 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 암시적입니다 이름공간이 패키지 https://www.python.org/dev/peps/pep-0420/ https://stackoverflow.com/questions/37139786/is-init-py-not-required-for-packages-in-python-3

해설 (3)

파이썬 패키지) 에 대한 정의는 매우 간단합니다. 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 deltamove 있을 수 있습니다. 이 있음을 디렉토리에는 패키지로의 것으로 봐야 한다. 물론 해당 내용에 ',' 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.py subPackage_b 이용할 수 있다.

__all__ = ['module_n2', 'module_n3']

실행 후:

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

Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named module_n1
  • 임포팅 모듈에서는 패키지 '는' 를 사용하여 업그레이드됨 주제라서요 init.py 컨텐트입니다.
해설 (1)

비록 '없이' 파일을 여전히 불신하니 포함시키십시오 파이썬 작동됨 init.py 합니다

따라서 이 때문에 명시합니다 패키지로의 대우를 받아야 모듈로 포함시키십시오 (비어 있는 경우에도).

  • 또한 실제로 사용할 수 있는 '' file:* init.py 있는 경우

  • 경식도 다음과 같은 파일 structure:* 상상할 수 있습니다

main_methods 
    |- methods.py

'와' (methods.py) 이 있었다.

def foo():
    return '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 '에서' '패키지' 는 json 임포트합니다 init.py 임포트하지 실제로 json (지켜보리니 숨겨요 파일 구조 여기서요).

  • 출처 번호:* &gt Lib/json/init.py ','
해설 (0)

즉 '치료' 가 init.py 디렉토리에는 비호환성의 적재 가능 모듈.

백성을위한 포지셔닝하십시오 판독값 코드, I put [두 Alchemist& # 39 의] (https://stackoverflow.com/users/2588818/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 "", line 1, in 
ImportError: No module named spam
>>> 
해설 (0)

다른 파이썬 파일을 쉽게 가져올 수 있습니다. 이 파일을 다른 파이 파일이 포함된 디렉토리(예: stuff)에 배치한 경우 import stuff.other와 같은 작업을 수행할 수 있습니다.

root\
    stuff\
         other.py

    morestuff\
         another.py

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

해설 (1)

'파일 수 있는' init.py 임포트합니다 간편해집니다. '내' 가 있는 경우, 함수 () '는' init.py 패키지로의 파일로부터는 브룩스피 '' 같은 가져올 수 있습니다. "' b 에서 임포트합니다 "' 그러나 그것 없이는 can& # 39, t 직접 가져올 수 있습니다. 시스템 경로 가능하다고 합니다. "' import sys 시s.파스콜린스트 (0, & # 39, path/to/b.py& # 39;)

b 에서 임포트합니다 "'

해설 (0)