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


173

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

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

import main

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

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

답변:


251

이것은 단지 파이썬이 작동하는 방식이므로 선언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 .

행복한 코딩.


1
확인하기 위해 "여기에서 'import'를 통해 호출되지 않은 경우에만 실행되는 내용"이라는 주석은 main () 아래에 명령이 작성됨을 의미합니까? 아니면 상관 없습니다 ??
Goldname

@Goldname if 문 내부의 코드는 가져올 때 실행되지 않지만 주 함수 자체는 정의되어 있으며 가져 오기를 통해서도 사용할 수 있습니다. 이 모듈은 실행될 때 주 기능 만 실행하며 가져온 경우 실행하지 않습니다. 그것은 모두 당신이하고 싶은 것에 달려 있습니다. 다른 곳에서 main 내부에 명령이 필요하지 않으면, if 안에 명령을 쓰십시오. 그러나 나에게는 더 깔끔해 보인다.
Felix

51

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

가져올 때만 모듈의 코드가 실행되는 것을 막기 위해 직접 실행될 때만 다음과 같이 코드를 보호 할 수 있습니다 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()

12

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

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

4

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

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


1
참고로 : 오류를 방지 할 수 있도록 환경을 수정할 수있는 방법이없는 경우, 아마 당신은 다른 모듈을 사용한다
cwallenpoole

4

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

if __name__ == '__main__':
  main()

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


3

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


2

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

#!/usr/bin/env python

__all__=["somevar", "do_something"]

somevar=""

def do_something():
    pass #blahblah

if __name__=="__main__":
    do_something()

-1

import코드를 실행 하지 않으면 사용할 수 없습니다 . 변수를 입력 할 수있는 매우 빠른 방법이 있습니다. 를 사용하여 numpy.savez변수를 .npz 파일에 numpy 배열로 저장합니다. 그 후 다음을 사용하여 변수를로드 할 수 있습니다numpy.load .

자세한 설명을 참조하십시오 scipy documentation에서 을

이는 변수 및 변수 배열의 경우에만 해당되며 메소드 등의 경우에는 해당되지 않습니다.


-4

main.py에서 필요한 함수를 가져와보십시오. 그래서,

from main import SomeFunction

main.py의 함수와 동일하게 batch.py의 함수 이름을 지정했을 수 있으며 main.py를 가져올 때 프로그램은 batch.py ​​함수 대신 main.py 함수를 실행합니다. 위의 작업을 수행하면 문제가 해결됩니다. 나는 희망.


적어도 Windows에서는 그렇지 않습니다.
Martín Coll

2
import mainmain에서 현재 네임 스페이스로 모든 것을 가져 오지 않습니다. main현재 네임 스페이스에 단일 심볼 만 추가 하므로 충돌이 발생할 수 없습니다.
remram
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.