__init__py는 무엇을 위한 것입니까?
Python 소스 디렉토리의 용도는 무엇입니까?
이전에는 패키지의 필수 부분이었다(새로운 3.3 이상의 "네임스페이스 패키지"가 아닌, 3.3 이전 버전의 "일반 패키지").
Python은 일반 패키지와 네임스페이스 패키지의 두 가지 유형을 정의합니다.일반 패키지는 Python 3.2 이전에 존재했던 전통적인 패키지입니다.는, , 「 」, 「 」, 「 」를 포함한 디렉토리로 .
__init__.py
때 이 파일을 합니다. 「 」 「 」 、 「 」,__init__.py
파일이 암묵적으로 실행되며, 파일이 정의하는 개체는 패키지 네임스페이스의 이름에 바인딩됩니다.__init__.py
파일에는 다른 모듈이 포함할 수 있는 것과 동일한 Python 코드가 포함될 수 있으며 Python은 Import 시 모듈에 몇 가지 속성을 추가합니다.
만 하면 네임스페이스 , 및 패키지는 네임스페이스 패키지가 없는 입니다.__init__.py
.
이름: " " "__init__.py
디스크상의디렉토리를 파이선 패키지 디렉토리로 마크하기 위해서 사용합니다.만약 당신이files파일이 있는 경웄다.
mydir/spam/__init__.py
mydir/spam/module.py
그리고 그리고.mydir
코드를 수입수 있습니다 할은 길에 당신패스상에 있는 경우는에, 코드를 가져올 수 있습니다.module.py
as~하듯이
import spam.module
또는
from spam import module
만약 당신이 를 삭제했을 경우를 제거해__init__.py
파일, 파이선이 더 이상 그 디렉터리 안에 submodules에 모듈을 수입하려고 한다 실패할 것이다.파일, Python은 더 이상 해당 디렉토리 내의 서브모듈을 찾지 않으므로 모듈 수입 시도가 실패합니다.
그 그__init__.py
파일 보통이지만, 더 편리한 이름의 패키지의 선택된 부분 수출하는데 사용될 수 있고 편의 기능을 가지고 있거나, 등이 텅 비어 있다파일은 보통 비어 있지만 패키지의 일부분을 보다 편리한 이름으로 내보내고 편의 기능을 유지하는 데 사용할 수 있습니다.위의 예임을 감안할 때, init 모듈의 내용 as위의 예에서 init 모듈의 내용은 다음과 같이 액세스 할 수 있습니다 접근할 수 있다.
import spam
이것을 근거로 해서
는 파이선 소포처럼, Python패키지로 디렉토리에라벨을 붙이고를 정의하는 디렉터리 표시.__all__
그럼 패키지 수준에서 임의의 변수를 정의할 수 있습니다.패키지가 API와 같은 방법으로 자주 Import되는 것을 정의하는 경우 편리할 수 있습니다.이 패턴은 피토닉의 "평면이 내포된 것보다 낫다" 철학을 고수하도록 촉진합니다.
예
은 제가 중 입니다.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_module.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
더 나은 .암묵적인 것보다 더 나은" 원칙을 위반하지 않으려면 파일은 매우 얇아야 합니다.
주요 .__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
file은 Python이 자신을 포함하는 디렉토리를 모듈로 취급하도록 합니다.
또한 이 파일은 모듈에 로드되는 첫 번째 파일이기 때문에 모듈이 로드될 때마다 실행할 코드를 실행하거나 내보낼 서브모듈을 지정할 수 있습니다.
.3 Python 3.3부터__init__.py
Import Python을 Import합니다.
PEP 420: Implicit Namespace Packages를 확인합니다.
가 필요 없는
__init__.py
여러 경로 세그먼트에 자동으로 확장 가능한 마커 파일(PE 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-packageshttpsdocs.python.org/3/whatsnew/3.3.html#
https://www.python.org/dev/peps/pep-0420/httpswww.python.org/dev/peps//
Python 3 은 __init_ 입니다.py?
은 Python이 동작합니다.__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
에 inside inside inside main_methods
은 (「」/「」) 「Import」입니다.main_methods
.
「」의 했을 경우methods.py
로로 합니다.__init__.py
ㅇㅇㅇㅇ를 쓰면 요.foo()
importing importing를 Import하는 main_methods
:
import main_methods
print(main_methods.foo()) # Prints 'foo'
것은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.'__init__.py
는 패키지의 일부로 취급됩니다.
일부 Python 패키지는 실제로 이 기능을 제공합니다.예를 들어 JSON을 사용하는 경우입니다.import json
Import를 하고 .__init__.py
json
패키지(여기 패키지 파일 구조 참조):
소스 코드:
Lib/json/__init__.py
파이썬Java와 마찬가지로 계층 구조와 디렉토리 구조는 동일합니다., 지지 but but but but but but but but but but but but가 있어야 합니다.__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
* Import를 사용하면 는 "* Import"의 .__init__.py
★★★★★★ 。
__init__.py
한 module합니다.
코드 읽기를 좋아하는 분들을 위해 여기에 투비트 연금술사의 코멘트를 넣겠습니다.
$ 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
>>>
다른 python 파일을 쉽게 가져올 수 있습니다.이 파일을 다른 py 파일이 포함된 디렉토리(say stop)에 저장하면 import stop.other 등의 작업을 수행할 수 있습니다.
root\
stuff\
other.py
morestuff\
another.py
이 없으면 것이이 without__init__.py
Python은 소스코드가 어디에 있는지 몰라 패키지로 인식할 수 없기 때문에 디렉토리 내용 내에서는 other.py을 Import할 수 없습니다.
안__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
__init_.py는 API를 중단하지 않고 모듈을 패키지로 변환하거나 외부 네스트 네임스페이스 또는 개인 모듈을 만드는 것을 허용합니다*.이것은 네임스페이스를 확장할 때 도움이 됩니다.
파일 유틸리티가 있는 경우.함유된 파이
def foo():
...
는 접속할 수 .foo
함께
from util import foo
후에 유틸리티 함수를 상호작용에 대한 util
을 유지하기 위해 가 from util import foo
아직 동작하고 있습니다).util.py을 util로 이행할 수 있습니다.
util/
__init__.py
util.py
db.py
및 util/_init_.py do.
from util import *
하지만 이건 중복이에요.util/util.py 파일이 아닌 util 파일을 넣을 수 있습니다.py 콘텐츠는 __init_.py에 저장되며 사용자는 이제 할 수 있습니다.
from util import foo
from util.db import check_schema
좋은지 잘 알 수 생각합니다.util
는 "_init_"와 합니다.파이다util
표시
* 이것은 다른 답변에서 암시되지만, 여기서 강조하고 싶습니다.
** 수입체조 채용 부족.파일과 이름이 같은 새 패키지를 만드는 것은 작동하지 않습니다. 참조
Python 2를 사용하고 있고 파일의 형제들을 로드하고 싶다면 파일의 부모 폴더를 세션의 시스템 경로에 추가하면 됩니다.현재 파일이 init 파일인 경우와 거의 동일하게 동작합니다.
import os
import sys
dir_path = os.path.dirname(__file__)
sys.path.insert(0, dir_path)
그 후, 파일의 디렉토리와 관련된 정기적인 Import는 정상적으로 동작합니다.예.
import cheese
from vehicle_parts import *
# etc.
일반적으로는 적절한 init.py 파일을 사용하고 싶지만, 레거시 코드를 다룰 때 특정 파일을 로드하도록 하드 코딩된 라이브러리만 사용해야 할 수도 있습니다.그러한 경우에 이것은 대안이다.
init.py : 패키지 디렉토리에 있는 python 파일로 패키지 또는 패키지 내의 모듈을 Import할 때 호출됩니다.이를 사용하여 패키지 초기화 코드를 실행할 수 있습니다.즉, 패키지가 Import될 때마다 이 폴더의 다른 모듈이 실행되기 전에 python 문이 먼저 실행됩니다.이것은 c나 java 프로그램의 주요 기능과 유사하지만, 이것은 핵심 python 파일이 아닌 python 패키지 모듈(folder)에 존재합니다.또한 모듈을 python 파일로 Import할 때와 마찬가지로 이 init.py 파일에 정의된 글로벌 변수에 액세스할 수 있습니다.
예를 들어 pymodlib라는 폴더에 init.py 파일이 있습니다.이 파일에는 다음 문장이 포함되어 있습니다.
인쇄(f'){name}' pystructures = ['for_loop', 'while_loop', 'ifCondition'에 대해 init.py을 호출하고 있습니다.
솔루션 모듈, 노트북 또는 python 콘솔에 "pymodlib" 패키지를 Import하면 이 두 개의 문이 Import 중에 실행됩니다.따라서 로그 또는 콘솔에 다음과 같은 출력이 표시됩니다.
import pymodlib pymodlib init.py for pymodlib
python console의 다음 문장에서 다음을 수행합니다.글로벌 변수에 액세스할 수 있습니다.
pymodlib.pystructures는 다음과 같은 출력을 제공합니다.
['for_loop', 'while_loop', 'ifCondition']
이제 python 3.3 이후 폴더를 python 모듈로 만들기 위해 이 파일을 사용할 수 있게 되었습니다.python 모듈 폴더에 포함시키는 것을 생략합니다.
언급URL : https://stackoverflow.com/questions/448271/what-is-init-py-for
'programing' 카테고리의 다른 글
Java: Array List에서 중복을 검출하시겠습니까? (0) | 2022.10.07 |
---|---|
기본 키는 항상 서명되지 않아야 합니까? (0) | 2022.10.07 |
쿠키 이름 지정 - 모범 사례 (0) | 2022.10.07 |
문자열 대신 mariadb 10 uncompress() return blob (0) | 2022.10.07 |
Mac OS 설치에서 MySQL을 중지하려면 어떻게 해야 합니까? (0) | 2022.10.07 |