답변:
종종 파이썬 프로그램은 명령 행에서 .py 파일의 이름을 지정하여 실행됩니다.
$ python my_program.py
코드로 가득 찬 디렉토리 또는 zip 파일을 작성하고을 포함 할 수도 있습니다 __main__.py
. 그런 다음 명령 행에서 디렉토리 또는 zip 파일의 이름을 지정하면 __main__.py
자동으로 실행 됩니다.
$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
애플리케이션을 이와 같이 실행하면 이점을 얻을 수 있는지 스스로 결정해야합니다.
• 그래도 참고 __main__
모듈은 보통에서 오지 않는 __main__.py
파일입니다. 가능하지만 보통은 그렇지 않습니다. 과 같은 python my_program.py
스크립트를 실행하면 스크립트가 __main__
모듈 대신 모듈 로 실행됩니다 my_program
. 이는 모듈이로 실행 python -m my_module
되거나 다른 여러 가지 방식으로 실행되는 경우에도 발생합니다 .
__main__
오류 메시지에서 이름을 본다고해서 반드시 __main__.py
파일을 찾아야하는 것은 아닙니다 .
python3 program_dir
실행되었습니다 __init__.py
.
python3 dir
실행 __main__.py
하지만 __init__.py
, 반면에 python3 -m dir
실행 모두.
__main__.py
__init__.py
__main__.py
파일 은 무엇입니까 ?파이썬 모듈을 만들 main
때 프로그램의 진입 점으로 실행될 때 모듈이 일부 기능 (보통 함수에 포함되어 있음 )을 실행하게하는 것이 일반적 입니다. 이것은 일반적으로 대부분의 Python 파일의 맨 아래에있는 다음과 같은 일반적인 관용구로 수행됩니다.
if __name__ == '__main__':
# execute only if run as the entry point into the program
main()
를 사용하여 Python 패키지에 대해 동일한 의미를 얻을 수 있습니다 __main__.py
. 이것은 리눅스 쉘 프롬프트 $
입니다. Windows에 Bash (또는 다른 Posix 쉘)가 없으면 s demo/__<init/main>__.py
사이에 내용으로 다음 파일을 만드십시오 EOF
.
$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF
(Posix / Bash 쉘에서 각 cat 명령의 끝에 파일 끝 문자 인 + 를 입력 하여 << EOF
s 및 끝 EOF
s 없이 위의 작업을 수행 할 수 있습니다 )CtrlD
그리고 지금:
$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed
이를 문서에서 파생시킬 수 있습니다. 문서는 말합니다 :
__main__
— 최상위 스크립트 환경
'__main__'
최상위 코드가 실행되는 범위의 이름입니다. 모듈 은 표준 입력, 스크립트 또는 대화식 프롬프트에서 읽을 때와__name__
동일하게 설정'__main__'
됩니다.모듈은 자체 검사를 통해 메인 스코프에서 실행 중인지 여부를 감지 할 수 있습니다
__name__
. 이는 모듈이 스크립트로 실행될 때 또는python -m
가져올 때가 아닌 모듈에서 조건부로 코드를 실행하는 일반적인 관용구를 허용합니다 .if __name__ == '__main__': # execute only if run as a script main()
패키지의 경우
__main__.py
모듈 을 포함 시켜서 동일한 효과를 얻을 수 있습니다. 모듈을 실행하면 내용이 실행됩니다-m
.
이 파일을 단일 파일로 패키징하여 다음과 같이 명령 줄에서 실행할 수도 있습니다. 그러나 압축 패키지는 하위 패키지 또는 하위 모듈을 진입 점으로 실행할 수 없습니다.
$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed
만들 __main__.py
에 yourpackage
로가 실행 만드는 :
$ python -m yourpackage
-m
프로그램으로 만 모듈로 액세스 할 수있는 경우에만 작동합니다. 그렇지 않으면 python <yourpackage>
참고 : -m
옵션 없이
package
까요?
python -m <yourproject>
작동하지 않으면 -m
중복 옵션이지만 python <yourpackage>
잘 작동합니다.
a
하고 스크립트를 가정하면 a/b/c/__main__.py
... python -m b.c
디렉토리에서 실행되며 a
주 스크립트의 가져 오기는에 상대적 a
입니다. 그러나 python b/c
dir의 가져 오기 범위에서 실행 c
되므로 기본 스크립트와 같은 가져 오기 import b.d
는 실패합니다.
python -m program_dir
했고python program_dir
조금 다릅니다 : 후자__init__.py
는 디렉토리에서 실행되지 않습니다 (있는 경우).