Python 3.5.1을 사용하고 있습니다. https://docs.python.org/3/tutorial/modules.html#packages 에서 문서와 패키지 섹션을 읽었습니다.
이제 다음과 같은 구조가 있습니다.
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
이제는 /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
마찬가지로, 이제 집에서 다음과 Playground
같은 슈퍼 폴더가 있습니다 :
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
실제로 모든 종류의 작업을 수행 할 수 있습니다.
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
왜 이것이 작동합니까? 내가있을 필요하지만 __init__.py
모두에서 파일 (비어있는 작업 것) a
와 b
대한 module.py
임포트 될 때까지 파이썬 경로 지점 Playground
폴더?
이것은 파이썬 2.7에서 변경된 것으로 보입니다.
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
__init__.py
둘 다 ~/Playground/a
와 함께 ~/Playground/a/b
잘 작동합니다.
답변
Python 3.3+에는 파일 없이 패키지를 만들 수있는 암시 적 네임 스페이스 패키지 가 __init__.py
있습니다.
암시 적 네임 스페이스 패키지를 허용한다는 것은
__init__.py
파일 제공 요구 사항 이 완전히 삭제 되어 영향을받을 수 있음 을 의미합니다 .
__init__.py
파일을 사용 하는 오래된 방법은 여전히 Python 2에서 와 같이 작동합니다.
답변
중대한
@ Mike의 대답은 정확하지만 너무 정확하지 않습니다. Python 3.3 이상 이 파일 없이 패키지를 만들 수있는 암시 적 네임 스페이스 패키지 를 지원한다는 것은 사실입니다 __init__.py
.
그러나 이것은 다음에 만 적용됩니다 EMPTY__init__.py
파일 . 따라서 EMPTY__init__.py
파일은 더 이상 필요하지 않으므로 생략 할 수 있습니다. 패키지 또는 해당 모듈 또는 하위 패키지를 가져올 때 특정 초기화 스크립트를 실행하려면 여전히 __init__.py
파일이 필요 합니다. 이것은 왜 유용한 지 궁금한 경우 파일을 사용하여 추가 초기화를 수행 하려는 이유에 대한 훌륭한 스택 오버플로 답변 입니다 __init__.py
.
디렉토리 구조 예 :
parent_package/
__init__.py <- EMPTY, NOT NECESSARY in Python 3.3+
child_package/
__init__.py <- STILL REQUIRED if you want to run an initialization script
child1.py
child2.py
child3.py
parent_package/child_package/__init__.py
:
print("from parent")
실시 예
아래 예제 child_package
는 모듈 중 하나를 가져올 때 초기화 스크립트가 실행되는 방법을 보여줍니다 .
예 1 :
from parent_package import child_package # prints "from parent"
예 2 :
from parent_package.child_package import child1 # prints "from parent"
답변
당신이 가지고 있다면 setup.py
프로젝트에서 당신이 사용하는 find_packages()
그 안에,해야 할 필요가 __init__.py
패키지가 자동으로 찾을 수에 대한 모든 디렉토리에 파일을.
패키지는
__init__.py
파일 을 포함하는 경우에만 인식됩니다
UPD : 암시 적 네임 스페이스 패키지 __init__.py
를 사용 find_namespace_packages()
하지 않고 대신 사용하려는 경우
답변
암시 적 네임 스페이스 패키지를__init__.py
원할 경우에만 생략해야한다고 말하고 싶습니다 . 그것이 무엇을 의미하는지 모른다면, 아마도 그것을 원하지 않을 것이므로 파이썬 3에서도 짝수를 계속 사용해야합니다 .__init__.py