파이썬 소스 디렉터리에서 __init__.py
의 용도는 무엇인가요?
이전에는 패키지(최신 3.3+ 네임스페이스 패키지가 아닌 [이전, 3.3 이전 <일반 패키지>(https://docs.python.org/3/reference/import.html#regular-packages))의 필수 부분이었음)의 일부였습니다.
파이썬은 일반 패키지와 네임스페이스 패키지의 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 파이썬 3.2 이전 버전에 존재했던 전통적인 패키지입니다. 일반 패키지는 일반적으로 __init__.py
파일을 포함하는 디렉터리로 구현됩니다. 일반 패키지를 임포트하면 이 __init__.py
파일이 암시적으로 실행되고, 이 파일이 정의하는 객체는 패키지의 네임스페이스에 있는 이름에 바인딩됩니다. 이 __init__.py
파일에는 다른 모듈과 동일한 파이썬 코드가 포함될 수 있으며, 파이썬은 모듈을 임포트할 때 모듈에 몇 가지 추가 어트리뷰트를 추가합니다.
링크를 클릭하면 __init__.py
가 없는 네임스페이스 패키지에 대한 예제, 자세한 정보 및 설명이 포함되어 있습니다.
파일 이름이 '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
따라 이
파이썬 패키지 ',' 로 정의하고 all 레이블링을 디렉터리입니다 외에 '모든 변수를 정의할 수 있습니다 ' init.py http://support. 숨겨요 level. 언로드하기 편리한 경우가 자주 있는 경우 패키지로의 eventtest 생각하신거야 가져오기됨 같은 apiu 열었다. 이 패턴은 준수, 파이썬, 균등형 있는 것보다 더 나은 nested" " 장려한다. 철학.
예를 들어, # # 이 중 하나를 예로 든 내 프로젝트 ',' 내가 자주 임포트합니다 제시온메이커 상호 작용할 수 있는 '세션' 라는 내 데이터베이스. 내가 쓴 《 " 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 세션용으로 다음 구문을 사용하여 새로운 세션을 시작할 수 있습니다. 이 코드는 약간만이라도 내부나 외부에서 동일한 실행됨을 " database"; 패키지 디렉터리입니다.
from database import Session
session = Session()
물론 이렇게 좁은 편리함 - 세션 '에서' 새로운 파일 같은 다른 약간만이라도 정의하십시오 " 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 한다는 의견이 있는 것 같다 '' 파일을 피하기 위해 매우 얇은 위반, 명시성 " implicit" 것보다 낫다. 철학.
Init.py '' 두 가지 주요 원인
"' your_package/ init.py file1.py file2.py . fileN.py "'
"'
"'
데프 추가 (): 패스 "'
다른 () 에 추가 호출할 수 있습니다 다음
your_package 가져오기의 에서 추가
같은 file1 모른 채,
your_package.file1 가져오기의 에서 추가
조지 g. 콘피그 임포트합니다 조지 g. 콘피g. 딕트콘피그 (Your_logging_config)
이후 더 이상 필요하지 않은 것처럼 ',' init.py 파이썬 3.3tb 정의하십시오 디렉터리용 수입할 수 있는 파이썬 패키지.
확인란 [PEP 420. 암시적입니다 이름공간이 패키지] [1]:
>. 기본으로 지원하는 패키지 디렉터리용 init.py 필요하지 않은 '수' 표시자가 파일과 자동으로 스팬합니다 다중 경로 세그먼트만 (영감을 받은 다양한 제 3 자 접근 방법을 설명한 대로 이름공간이 패키지를 PEP 420)
[1]: https://docs.python.org/3/whatsnew/3.3.html # 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 암시적입니다 이름공간이 패키지 https://www.python.org/dev/peps/pep-0420/ https://stackoverflow.com/questions/37139786/is-init-py-not-required-for-packages-in-python-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 "<stdin>", line 1, in <module>
ImportError: No module named module_n1
비록 '없이' 파일을 여전히 불신하니 포함시키십시오 파이썬 작동됨 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 (지켜보리니 숨겨요 파일 구조 여기서요).
즉 '치료' 가 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 "<stdin>", line 1, in <module>
ImportError: No module named spam
>>>
다른 파이썬 파일을 쉽게 가져올 수 있습니다. 이 파일을 다른 파이 파일이 포함된 디렉토리(예: stuff)에 배치한 경우 import stuff.other와 같은 작업을 수행할 수 있습니다.
root\
stuff\
other.py
morestuff\
another.py
stuff 디렉터리 안에 이 __init__.py
가 없으면 파이썬이 stuff의 소스 코드가 어디에 있는지 알지 못하고 패키지로 인식할 수 없기 때문에 other.py를 가져올 수 없습니다.
'파일 수 있는' init.py 임포트합니다 간편해집니다. '내' 가 있는 경우, 함수 () '는' init.py 패키지로의 파일로부터는 브룩스피 '' 같은 가져올 수 있습니다. "' b 에서 임포트합니다 "' 그러나 그것 없이는 can& # 39, t 직접 가져올 수 있습니다. 시스템 경로 가능하다고 합니다. "' import sys 시s.파스콜린스트 (0, & # 39, path/to/b.py& # 39;)
b 에서 임포트합니다 "'