[python] 파이썬이 모듈을 가져올 때 왜 모듈을 실행합니까? 어떻게 중지합니까?

두 가지 방법 중 하나로 실행할 수있는 Python 프로그램이 있습니다. 첫 번째는 “python main.py”를 호출하여 사용자에게 친숙한 방식으로 입력하라는 메시지를 표시 한 다음 프로그램을 통해 사용자 입력을 실행하는 것입니다. 다른 방법은 “python batch.py -file- ” 을 호출 하여 모든 친숙한 입력 수집을 통과하고 한 번에 프로그램을 통해 전체 파일의 입력 값을 실행하는 것입니다.

문제는 “batch.py”를 실행할 때 “main.py”에서 일부 변수 / 방법 / 등을 가져오고이 코드를 실행할 때입니다.

import main

프로그램의 첫 번째 줄에서 “main.py”에서 코드를 실행하려고하기 때문에 즉시 오류가 발생합니다.

가져 오는 “main”모듈에 포함 된 코드를 Python에서 실행하지 못하게하려면 어떻게해야합니까?



답변

이것은 단지 파이썬이 작동하는 방식이므로 선언class 과 같은 키워드 def아닙니다 . 대신, 그것들 은 실행되는 실제 라이브 진술 입니다. 그들이 실행되지 않으면 모듈은 .. empty 🙂

어쨌든 관용적 접근법은 다음과 같습니다.

# stuff to run always here such as class/def
def main():
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

무엇을 참조하십시오 ?if __name__ == "__main__"

모듈에 대한 소스 제어가 필요합니다. import그러나 ed .

행복한 코딩.


답변

파이썬의 작동 방식으로 인해 모듈을 가져올 때 모듈을 실행해야합니다.

가져올 때만 모듈의 코드가 실행되는 것을 막기 위해 직접 실행될 때만 다음과 같이 코드를 보호 할 수 있습니다 if.

if __name__ == "__main__":
    # this won't be run when imported

이 코드를 main()메소드 에 넣어 파일을 직접 실행하거나 모듈을 가져 와서을 호출 할 수 main()있습니다. 예를 들어, 이것이 파일에 있다고 가정하십시오 foo.py.

def main():
    print "Hello World"

if __name__ == "__main__":
    main()

이 프로그램은으로 이동 python foo.py하거나 다른 Python 스크립트에서 실행할 수 있습니다 .

import foo

...

foo.main()


답변

if __name__ == '__main__'관용구 사용 – 모듈을 스크립트로 실행중인 경우 __name__값을 '__main__'가져오고 가져 오는 경우 모듈 이름 인 특수 변수입니다 . 그래서 당신은 같은 것을 할 것입니다

# imports
# class/function definitions
if __name__ == '__main__':
    # code here will only run when you invoke 'python main.py'


답변

불행히도, 당신은하지 않습니다. 이는 가져 오기 구문의 작동 방식 중 일부이며 그렇게하는 것이 중요합니다.def 파이썬이 import를 실행하지 않았다면 실제로 실행 된 하지 않아도됩니다.

그러나 파일에 액세스 할 수 있기 때문에 오류의 원인을보고 확인할 수 있습니다. 오류가 발생하지 않도록 환경을 수정하는 것이 가능할 수 있습니다.


답변

함수 안에 코드를 넣으면 함수를 호출 할 때까지 코드가 실행되지 않습니다. 에 주요 기능이 있어야합니다 main.py. 진술과 함께 :

if __name__ == '__main__':
  main()

그런 다음 호출 python main.py하면 main()함수가 실행됩니다. 가져 오는 main.py경우에는 그렇지 않습니다. 또한 main.py명확성을 위해 다른 이름 으로 바꾸어야 할 수도 있습니다.


답변

관용구를 다음과 같이 대체하려는 Python 향상 제안 PEP 299 가있었습니다.if __name__ == '__main__':def __main__: 있었지만 거부되었습니다. 를 사용할 때 명심해야 할 사항을 아는 것은 여전히 ​​좋은 독서 if __name__ = '__main__':입니다.


답변

“main.py”를 다음과 같이 쓸 수 있습니다 :

#!/usr/bin/env python

__all__=["somevar", "do_something"]

somevar=""

def do_something():
    pass #blahblah

if __name__=="__main__":
    do_something()