python 파이썬 클래스 - __name__ == "__main__"은 무엇을합니까?





13 Answers

스크립트를 명령으로 전달하여 Python 인터프리터에 스크립트를 실행하면,

python myscript.py

들여 쓰기 레벨 0에있는 모든 코드가 실행됩니다. 함수와 정의 된 클래스는 잘 정의되어 있지만 코드는 실행되지 않습니다. 다른 언어와 달리 main() 함수는 자동으로 실행되지 않습니다. main() 함수는 암시 적으로 최상위 레벨에있는 모든 코드입니다.

이 경우 최상위 코드는 if 블록입니다. __name__ 은 현재 모듈의 이름으로 평가되는 내장 변수입니다. 그러나 위의 myscript.py 같이 모듈을 직접 실행하는 경우 __name__ 대신 "__main__" 문자열이 설정됩니다. 따라서 스크립트를 직접 실행하거나 테스트를 통해 다른 스크립트에서 가져 오는지 테스트 할 수 있습니다

if __name__ == "__main__":
    ...

스크립트를 다른 모듈로 가져 오는 경우 다양한 함수 및 클래스 정의를 가져오고 해당 최상위 코드가 실행되지만 위의 if 절의 본문 코드는 조건으로 실행되지 않습니다 충족되지 않았습니다. 기본 예제로 다음 두 스크립트를 고려하십시오.

# file one.py
def func():
    print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
    print("one.py is being run directly")
else:
    print("one.py is being imported into another module")
# file two.py
import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
    print("two.py is being run directly")
else:
    print("two.py is being imported into another module")

이제 인터프리터를 다음과 같이 호출하면

python one.py

출력은

top-level in one.py
one.py is being run directly

대신 two.py 를 실행하는 경우 :

python two.py

너는 얻는다.

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly

따라서 모듈 one __name__ 드되면 __name__"__main__" 대신 "one" 같습니다.

모듈 '__ __'

if __name__ == "__main__": 은 무엇을합니까?

# Threading example
import time, thread

def myfunction(string, sleeptime, lock, *args):
    while True:
        lock.acquire()
        time.sleep(sleeptime)
        lock.release()
        time.sleep(sleeptime)

if __name__ == "__main__":
    lock = thread.allocate_lock()
    thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
    thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))



if __name__ == "__main__": 은 무엇을합니까?

기본 사항 개요 :

  • 프로그램의 엔트리 포인트 인 모듈의 전역 변수 __name__'__main__' 입니다. 그렇지 않으면 모듈을 가져 오는 이름입니다.

  • 따라서 if 블록 아래의 코드는 모듈이 프로그램의 진입 점인 경우에만 실행됩니다.

  • 가져 오기에서 코드 블록을 실행하지 않고도 모듈의 코드를 다른 모듈에서 가져올 수 있습니다.

왜 우리가 이것을 필요로합니까?

코드 개발 및 테스트

모듈로 사용하도록 고안된 Python 스크립트를 작성한다고 가정 해 보겠습니다.

def do_important():
    """This function does something very important"""

이 함수 호출을 맨 아래에 추가하여 모듈을 테스트 할 수 있습니다 .

do_important()

명령 프롬프트에서 다음과 같이 실행합니다.

~$ python important.py

문제

그러나 다른 스크립트로 모듈을 가져 오려면 다음을 수행하십시오.

import important

가져올 때 do_important 함수가 호출 될 것이므로 하단의 함수 호출 do_important() 주석 처리하십시오.

# do_important() # I must remember to uncomment to execute this!

그런 다음 테스트 함수 호출을 주석 처리했는지 여부를 기억해야합니다. 그리고이 여분의 복잡성은 당신이 잊을 확률이 높다는 것을 의미합니다.

더 나은 방법

__name__ 변수는 현재 Python 인터프리터가있을 때마다 네임 스페이스를 가리 킵니다.

가져온 모듈 내에서 그 모듈의 이름입니다.

하지만 기본 모듈 (또는 대화 형 Python 세션, 즉 인터프리터의 읽기, 평가, 인쇄 루프 또는 REPL)에서는 "__main__" 에서 모든 것을 실행합니다.

따라서 실행 전에 확인하는 경우 :

if __name__ == "__main__":
    do_important()

위와 같이 코드는 기본 모듈로 실행하거나 (또는 ​​의도적으로 다른 스크립트에서 호출 할 때만) 실행됩니다.

더 나은 길

이 문제를 개선하기위한 Pythonic 방법이 있습니다.

이 비즈니스 프로세스를 모듈 외부에서 실행하려면 어떻게해야합니까?

다음과 같이 함수를 개발하고 테스트 할 때 연습 할 코드를 넣은 후 바로 '__main__' 확인하십시오.

def main():
    """business logic for when running this module as the primary one!"""
    setup()
    foo = do_important()
    bar = do_even_more_important(foo)
    for baz in bar:
        do_super_important(baz)
    teardown()

# Here's our payoff idiom!
if __name__ == '__main__':
    main()

모듈을 기본 모듈로 실행하면 모듈의 마지막 기능이 실행됩니다.

main 함수를 실행하지 않고 모듈과 그 함수와 클래스를 다른 스크립트로 임포트 할 수있게 해주 며 다른 '__main__' 모듈에서 실행할 때 모듈과 그 함수와 클래스를 호출 할 수있게합니다.

import important
important.main()

이 관용구는 파이썬 문서에서 __main__ 모듈에 대한 설명에서 찾을 수 있습니다. 그 텍스트 상태 :

이 모듈은 인터프리터의 주 프로그램이 실행되는 (그렇지 않으면 익명의) 범위 (표준 입력, 스크립트 파일 또는 대화식 프롬프트에서 읽은 명령)를 나타냅니다. 관용적 인 "조건부 스크립트"스탠자가 스크립트를 실행하게하는 환경은 다음과 같습니다.

if __name__ == '__main__':
    main()



if __name__ == "__main__": 은 무엇을합니까?

__name__ 은 모든 네임 스페이스에있는 전역 변수 (파이썬에서는 global은 모듈 수준 에서 실제로 의미 함)입니다. 일반적으로 모듈의 이름입니다 ( str 형식).

그러나 특별한 경우로서, mycode.py에서와 같이 어떤 Python 프로세스를 실행하든 :

python mycode.py

그렇지 않으면 익명의 전역 네임 스페이스에는 __name__'__main__' 값이 할당됩니다.

따라서 최종 라인을 포함 하여

if __name__ == '__main__':
    main()
  • mycode.py 스크립트의 끝에,
  • 파이썬 프로세스에 의해 실행되는 기본, 엔트리 포인트 모듈 일 때,

스크립트의 유일하게 정의 된 main 함수가 실행됩니다.

이 구문을 사용하면 다음과 같은 이점이 있습니다. 코드를 다른 스크립트의 모듈로 가져온 다음 프로그램에서 결정할 때 main 함수를 실행할 수도 있습니다.

import mycode
# ... any amount of other code
mycode.main()



모듈 ( M.py )에 main (not import)으로 실행될 특정 명령문이있을 때,이 문장 (test-cases, print statements) M.py if 블록에 넣을 수 있습니다.

기본적으로 (모듈이 메인으로 실행되고 임포트되지 않을 때) __name__ 변수는 "__main__" 설정되며, import 될 때 __name__ 변수는 다른 값을 가지게됩니다. 아마도 모듈의 이름 ( 'M' ). 이는 모듈의 다양한 변형을 함께 실행하고 특정 입력 및 출력 명령문을 분리하고 테스트 케이스가있는 경우에도 유용합니다.

, 모듈을 가져올 때 (특정) 코드가 실행되지 않도록하려면 ' if __name__ == "main" '블록을 사용하십시오.




간단히 말하면 __name__ 은 각 스크립트에 대해 정의 된 변수로 스크립트가 주 모듈로 실행되는지 또는 가져온 모듈로 실행되는지를 정의합니다.

그래서 두 개의 스크립트가 있다면;

#script1.py
print "Script 1's name: {}".format(__name__)

#script2.py
import script1
print "Script 2's name: {}".format(__name__)

script1 실행 결과는 다음과 같습니다.

Script 1's name: __main__

그리고 script2 실행 결과는 다음과 같습니다.

Script1's name is script1
Script 2's name: __main__

보시다시피, __name__ 은 어떤 코드가 'main'모듈인지 알려줍니다. 이것은 코드를 작성할 수 있고 C / C ++와 같은 구조적 문제에 대해 걱정할 필요가 없기 때문에 훌륭합니다. 파일이 'main'함수를 구현하지 않으면 실행 파일로 컴파일 할 수없고, 그런 다음 라이브러리로 사용할 수 없습니다.

위대한 일을하는 Python 스크립트를 작성하고 다른 용도로 유용한 기능을 구현하십시오. 만약 내가 그것을 사용하고 싶다면 스크립트를 가져 와서 프로그램을 실행하지 않고 사용할 수 있습니다 (코드는 if __name__ == "__main__": 컨텍스트 내에서만 실행됩니다). 반면에 C / C ++에서는 파일을 포함하는 별도의 모듈로 그 조각을 분할해야합니다. 상황을 그림으로 그려라.

화살표는 가져 오기 링크입니다. 앞의 모듈 코드를 포함하려고하는 세 개의 모듈에 대해 여섯 개의 파일 (구현 파일 수는 9 개)과 다섯 개의 링크가 있습니다. 이렇게하면 특별히 라이브러리로 컴파일되지 않는 한 C 프로젝트에 다른 코드를 포함하기가 어렵습니다. 이제 파이썬을위한 그림 :

모듈을 작성하고 코드를 사용하려는 사람은 코드를 가져오고 __name__ 변수는 프로그램의 실행 부분을 라이브러리 부분과 분리하는 데 도움이 될 수 있습니다.




중히 여기다:

if __name__ == "__main__":
    main()

Python 스크립트의 __name__ 속성이 "__main__" 합니다. 즉, 프로그램 자체가 실행되면 속성은 __main__ 이되어 프로그램이 실행됩니다 (이 경우 main() 함수).

그러나 파이썬 스크립트가 모듈에 의해 사용 if , if 문 밖의 모든 코드가 실행될 것입니다. 따라서 프로그램이 모듈로서 사용되는지 여부를 확인하기 위해 if \__name__ == "\__main__" 이 사용되는 경우, 따라서 코드를 실행할 것인지 결정합니다.




시스템 (파이썬 인터프리터)이 소스 파일 (모듈)에 제공하는 많은 변수가 있습니다. 언제든지 원하는 값을 얻을 수 있으므로 __name__ 변수 / 속성에 집중 해 보겠습니다.

파이썬이 소스 코드 파일을로드 할 때, 소스 코드 파일에있는 모든 코드를 실행합니다. (파일에 정의 된 모든 메서드와 함수를 호출하지는 않지만 정의하고 있습니다.)

인터프리터가 소스 코드 파일을 실행하기 전에, 그것은 그 파일을위한 몇 가지 특별한 변수를 정의한다; __name__ 은 Python이 각 소스 코드 파일에 대해 자동으로 정의하는 특수 변수 중 하나입니다.

파이썬이이 소스 코드 파일을 주 프로그램 (즉, 실행중인 파일)으로로드하는 경우이 파일의 특수 __name__ 변수에 "__main__" 값을 설정합니다.

이 모듈을 다른 모듈에서 가져 오면 __name__ 이 해당 모듈의 이름으로 설정됩니다.

그래서, 당신의 예를 들어 보겠습니다.

if __name__ == "__main__":
   lock = thread.allocate_lock()
   thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
   thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))

코드 블록 :

lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))

모듈을 직접 실행할 때만 실행됩니다. 해당 특정 인스턴스에서 __name__ 의 값이 " main "과 같지 않으므로 다른 모듈이 호출하거나 가져 오는 경우 코드 블록이 실행되지 않습니다.

희망이 도움이됩니다.




이것은 명령 줄에서 파이썬 파일이 호출 될 때 특별합니다. 이것은 일반적으로 "main ()"함수를 호출하거나 예를 들어 명령 행 인수와 같은 다른 적절한 시작 코드를 실행하는 데 사용됩니다.

몇 가지 방법으로 작성 될 수 있습니다. 다른 하나는 :

def some_function_for_instance_main():
    dosomething()


__name__ == '__main__' and some_function_for_instance_main()

프로덕션 코드에서 사용해야한다고 말하는 것은 아니지만 if __name__ == '__main__' "마법"이 없음을 보여줍니다. Python 파일에서 main 함수를 호출하기위한 좋은 규칙입니다.




대한 이유

if __name__ == "__main__":
    main()

주로 코드를 직접 가져 오는 것으로 인해 발생하는 가져 오기 잠금 문제를 방지하기위한 것입니다. 파일이 직접 호출 된 경우 main() 을 실행하고 싶습니다 main() __name__ == "__main__" 경우). 코드를 가져온 경우 가져 오기 잠금 문제를 피하려면 가져 오기 프로그램에서 실제 주 모듈의 코드를 입력해야합니다.

부작용은 여러 진입 점을 지원하는 방법론에 자동으로 사인 온한다는 것입니다. main() 을 엔트리 포인트로 사용하여 프로그램을 실행할 수 있지만 반드시 그렇게 할 필요는 없습니다 . setup.pymain() 기대하지만, 다른 툴은 대체 진입 점을 사용합니다. 예를 들어 파일을 gunicorn 프로세스로 실행하려면 main() 대신 app() 함수를 정의합니다. setup.py 와 마찬가지로 gunicorn 은 코드를 가져 오므로 가져 오기 잠금 문제로 인해 가져 오는 동안 아무 것도하지 않으려 고합니다.




중히 여기다:

print __name__

위 출력은 __main__ 입니다.

if __name == "__main__":
  print "direct method"

위의 문장은 true이고 "직접 메소드"를 출력합니다. 이 클래스를 다른 클래스에서 가져온 경우 가져 오는 동안 __name__ equal to "firstmodel name" 설정하므로 "직접 메소드"가 인쇄되지 않는다고 가정합니다.




이 .py 파일을 다른 .py 파일로 가져 오면 "if 문"아래의 코드가 실행되지 않습니다.

이 .py가 shell 아래에서 python this_py.py 에 의해 실행되거나 Windows에서 두 번 클릭되면. "if 문"아래의 코드가 실행됩니다.

일반적으로 테스트 용으로 작성됩니다.




모든 대답은 기능을 설명했다. 그러나 개념을 더 명확히하는 데 도움이 될 수있는 사용법의 한 예를 제공 할 것입니다.

두 개의 Python 파일 인 a.py와 b.py가 있다고 가정합니다. 이제 a.py는 b.py를 가져옵니다. 먼저 "import b.py"코드가 먼저 실행되는 a.py 파일을 실행합니다. 나머지 a.py 코드가 실행되기 전에 b.py 파일의 코드가 완전히 실행되어야합니다.

b.py 코드에는 b.py 파일에만 독점적 인 코드가 있으며 b.py 파일을 가져온 다른 파일 (b.py 파일 제외)은 실행하지 않으려 고합니다.

이것이 바로이 코드 라인이 확인하는 것입니다. 이 코드가 실행중인 주 파일 (즉, b.py) 인 경우 (이 경우 a.py가 실행중인 주 파일 임) 코드 만 실행됩니다.




if name == ' main ':

우리는 __name__ == '__main__':꽤 자주 볼 수 있습니다.

모듈을 가져올 것인지 여부를 확인합니다.

즉, if코드가 직접 실행될 때만 블록 내의 코드가 실행됩니다. 여기는 directly의미 not imported합니다.

모듈의 이름을 출력하는 간단한 코드를 사용하여 무엇을하는지 봅시다.

# test.py
def test():
   print('test module name=%s' %(__name__))

if __name__ == '__main__':
   print('call test()')
   test()

직접 코드를 실행하면 python test.py모듈 이름은 __main__다음과 같습니다.

call test()
test module name=__main__



Related