답변:
패키지의 필수 부분이되었습니다 ( 이전 3.3+ "네임 스페이스 패키지"가 아닌 3.3 이전 "일반 패키지" ).
파이썬은 일반 패키지와 네임 스페이스 패키지라는 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 Python 3.2 및 이전 버전에 존재했던 기존 패키지입니다. 일반 패키지는 일반적으로
__init__.py
파일을 포함하는 디렉토리로 구현됩니다 . 일반 패키지를 가져 오면이__init__.py
파일이 내재적으로 실행되고 정의 된 객체가 패키지 네임 스페이스의 이름에 바인딩됩니다.__init__.py
파일은 다른 모듈을 포함 할 수있는 동일한 파이썬 코드를 포함 할 수 있으며 가져올 때 파이썬 모듈에 몇 가지 추가 속성을 추가합니다.
그러나 링크를 클릭하면 예제, 추가 정보 및 네임 스페이스 패키지에 대한 설명, 패키지가없는 종류가 포함됩니다 __init__.py
.
sys.path.insert(0, '/path/to/datetime')
해당 경로를 방금 만든 디렉토리의 경로로 바꿉니다. 이제 같은 것을 시도하십시오 from datetime import datetime;datetime.now()
. 이제 빈 파일을 가져 오기 때문에 AttributeError가 발생합니다. 빈 init 파일을 작성하지 않고이 단계를 반복하면 이런 일이 발생하지 않습니다. 그것이 예방하려는 의도입니다.
from datetime import datetime
오류없이 문제 가 발생 하면 잘못 설정 한 것입니다 . 버전 2.3으로 돌아가는 것이 좋습니다!
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을 ).
명명 된 파일 __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
이것을 기반으로
__init__.py
은 Python 2.X에서 필요했으며 여전히 Python 2.7.12 (필자는 테스트)에서 필요하지만 더 이상 (필수적으로) Python 3.3 이상에서는 필요하지 않으며 Python 3.4.3에서는 필요하지 않습니다 (I 그것을 테스트). 자세한 내용은 stackoverflow.com/questions/37139786 을 참조하십시오.
__init__.py
.
setup.py
있고 사용 find_packages()
하는 경우 __init__.py
모든 디렉토리 에 있어야 합니다. 참조 stackoverflow.com/a/56277323/7127824을
파이썬 패키지와 디렉토리를 라벨 및 정의뿐만 아니라 __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
는 "명시적인 것이 암시적인 것보다 낫다"는 철학을 위반하지 않도록 파일이 매우 얇아 야 한다는 것 같습니다 .
engine
, sessionmaker
, create_engine
, 및 os
모든도에서 가져올 수 있습니다 database
당신이 네임 스페이스의 엉망으로 만든 것 같은 ... 지금 보인다.
__all__ = [...]
가져올 항목을 제한하는 데 사용할 수 있습니다 import *
. 그러나 그 외에도, 최상위 수준의 네임 스페이스가 남아 있습니다.
두 가지 주요 이유가 있습니다 __init__.py
편의상 : 다른 사용자는 패키지 계층에서 함수의 정확한 위치를 알 필요가 없습니다.
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
무언가를 초기화하고 싶다면; 예를 들어, 로깅 (최상위 레벨에 배치해야 함) :
import logging.config
logging.config.dictConfig(Your_logging_config)
__init__.py
가 유용한 경우도 있지만 항상 그런 것은 아닙니다.
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가 필요하지 않습니까?
파이썬에서 패키지의 정의는 매우 간단합니다. 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__.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
내용 이 적용됩니다 .
from package_x.subPackage_b.module_n1 import function_X
파이썬은 __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
__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
>>>
다른 파이썬 파일을 쉽게 가져올 수 있습니다. 이 파일을 다른 py 파일이 들어있는 디렉토리 (예 : stuff)에 넣으면 import stuff.other와 같은 것을 할 수 있습니다.
root\
stuff\
other.py
morestuff\
another.py
__init__.py
파이썬은 디렉토리 소스 내부에 없으면 소스의 소스 코드가 어디에 있는지 알지 못하고 패키지로 인식 할 수 없기 때문에 other.py를 가져올 수 없습니다.
__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