__main__.py은 (는) 무엇 이죠?


326

__main__.py파일 은 무엇이며 어떤 종류의 코드를 넣어야하며 언제 사용해야합니까?

답변:


320

종종 파이썬 프로그램은 명령 행에서 .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파일을 찾아야하는 것은 아닙니다 .


22
나는 발견 python -m program_dir했고 python program_dir조금 다릅니다 : 후자 __init__.py는 디렉토리에서 실행되지 않습니다 (있는 경우).
brk

5
@brk : 지금은 그렇지 않은 것 같습니다. 방금 시도했는데 python3 program_dir실행되었습니다 __init__.py.
mk12

@ mk12 난 그냥 BRK의 발견 @ 확인할 수 있습니다 그것을 시도 : python3 dir실행 __main__.py하지만 __init__.py, 반면에 python3 -m dir실행 모두.
Marcello Romani

1
@ mk12 아마 당신은__main__.py__init__.py
wim

100

__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 명령의 끝에 파일 끝 문자 인 + 를 입력 하여 << EOFs 및 끝 EOFs 없이 위의 작업을 수행 할 수 있습니다 )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

31

__main__.pyzip 파일의 파이썬 프로그램에 사용됩니다. __main__.pyzip 파일을 실행하면 파일이 실행됩니다. 예를 들어, zip 파일이 다음과 같은 경우 :

test.zip
     __main__.py

그리고 내용 __main__.py

import sys
print "hello %s" % sys.argv[1]

우리가 도망 python test.zip world가면 우리는 나올 hello world것입니다.

따라서 __main__.pyzip 파일에서 Python을 호출 하면 파일이 실행됩니다.


23

만들 __main__.pyyourpackage로가 실행 만드는 :

$ python -m yourpackage

1
-m프로그램으로 만 모듈로 액세스 할 수있는 경우에만 작동합니다. 그렇지 않으면 python <yourpackage>참고 : -m옵션 없이
Benyamin Jafari

1
@BenyaminJafari 모듈 로 액세스 할 수없는 명령 행 Python 프로그램을 작성할 수 없습니다 . 아마 당신은 의미했을 package까요?
anatoly techtonik

1
메인 .py 를 포함하는 Python 패키지를 만들 때 python -m <yourproject>작동하지 않으면 -m중복 옵션이지만 python <yourpackage>잘 작동합니다.
Benyamin Jafari

@BenyaminJafari -m 플래그는 경우에 따라 차이를 만듭니다. 디렉토리에서 실행 a하고 스크립트를 가정하면 a/b/c/__main__.py... python -m b.c디렉토리에서 실행되며 a주 스크립트의 가져 오기는에 상대적 a입니다. 그러나 python b/cdir의 가져 오기 범위에서 실행 c되므로 기본 스크립트와 같은 가져 오기 import b.d는 실패합니다.
MikeCPT

14

스크립트가 단일 파이썬 파일이 아닌 디렉토리 또는 ZIP 파일 인 __main__.py경우, "스크립트"가 파이썬 인터프리터에 인수로 전달 될 때 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.