IT이야기

가져올 때 Python이 내 모듈을 실행하는 이유와 중지 방법은?

cyworld 2022. 3. 7. 21:31
반응형

가져올 때 Python이 내 모듈을 실행하는 이유와 중지 방법은?

나는 내가 만들고 있는 파이톤 프로그램을 두 가지 방법 중 하나로 실행할 수 있다. 첫 번째 방법은 사용자에게 친근한 방식으로 입력을 유도한 다음 프로그램을 통해 사용자 입력을 실행하는 것이다.또 다른 방법은 "batch.py -file-"로 전화를 걸어 모든 친근한 입력 수집을 넘겨주고 프로그램을 통해 한 번에 파일 한 개 분량의 입력 내용을 실행하는 것이다.

문제는 "batch.py"을 실행하면 "main.py"에서 일부 변수/변수/변수/etc를 가져오며, 이 코드를 실행하면 다음과 같다.

import main

프로그램의 첫 번째 줄에서, 그것은 "main.py"에서 코드를 실행하려고 하기 때문에 즉시 오류를 범한다.

가져오는 "메인" 모듈에 포함된 코드를 Python이 실행하는 것을 어떻게 중지할 수 있는가?

왜냐하면 Python은 단지 이렇게 작동하기 때문이다 - 키워드와 같은class그리고def선언이 아니다.대신에, 그것들은 실제 실행된 생생한 진술이다.만약 그들이 실행되지 않는다면 당신의 모듈은 비어있을 것이다.

관용적 접근법은 다음과 같다.

# 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:

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파이썬이 가져오기를 실행하지 않았다면 기능 없이 꼼짝도 못 했을 겁니다

그러나 파일에 액세스할 수 있기 때문에 오류를 일으키는 원인이 무엇인지 확인할 수 있을 것이다.오류가 발생하지 않도록 환경을 수정할 수도 있다.

코드를 함수에 넣으면 함수를 호출할 때까지 실행되지 않는다. 기능이 .main.py 이 문구와 함께:

if __name__ == '__main__':
  main()

그럼 전화하면python main.pymain()기능이 실행될 것이다.가져오는 경우main.py그렇지 않을 것이다.또한, 당신은 아마도 이름을 바꾸어야 한다.main.py확실히 하기 위해 다른 어떤 것으로.

다음과 같이 "main.py"을 쓰십시오.

#!/usr/bin/env python

__all__=["somevar", "do_something"]

somevar=""

def do_something():
    pass #blahblah

if __name__=="__main__":
    do_something()

PEP 299는 Python을 대체하는 것을 목표로 하는 강화 제안이 있었다.if __name__ == '__main__':을 숙어하다.def __main__:, 그러나 거절당했다.사용할 때 유의해야 할 사항을 아는 것은 여전히 좋은 읽을거리다.if __name__ = '__main__':.

난 간단한 테스트를 했다.

#test.py

x = 1
print("1, has it been executed?")


def t1():
     print("hello")
     print("2, has it been executed?")


def t2():
     print("world")
     print("3, has it been executed?")


def main():
     print("Hello World")
     print("4, has it been executed?")


print("5, has it been executed?")
print(x)

# while True:
# t2()

if x == 1:
     print("6, has it been executed?")

#test2.py

import test

test2.py을 실행하거나 실행할 때 실행 결과:

1, has it been executed?

5, has it been executed?

1

6, has it been executed?

결론:가져온 모듈이 추가되지 않으면 현재 모듈이 실행되며, 기능에 없는 가져온 모듈의 코드는 순차적으로 실행되며, 호출되지 않을 때는 해당 기능의 코드가 실행되지 않는다.

덧붙여:

def main():
    # Put all your code you need to execute directly when this script run directly.
    pass

if __name__ == '__main__':
    main() 
else:
    # Put functions you need to be executed only whenever imported

특히 완전한 분석을 수행하는 파이선 스크립트/기능을 배포할 때 발생할 수 있는 사소한 오류(적어도 나에게 일어난 일)는 함수 .py 파일의 끝에 있는 함수를 직접 호출하는 것이었다.사용자가 수정해야 할 것은 입력 파일과 파라미터뿐이었다.가져올 때 그렇게 하면 즉시 기능이 실행될 것이다.적절한 동작을 위해서는 단순히 함수에 대한 내부 호출을 제거하고 코드의 실제 호출 파일/기능/포텐션용으로 예약하면 된다.

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

스크파이 설명서의 전체 설명을 참조하십시오.

이는 변수 및 변수 배열의 경우에만 해당되며 방법 등은 해당되지 않는다는 점에 유의하십시오.

main.py에서 필요한 기능만 가져오시겠습니까?그렇게

from main import SomeFunction

당신이 batch.py의 함수 이름을 main.py의 것과 같게 지었을 수도 있고, 당신이 main.py을 수입할 때 그 프로그램은 batch.py 함수 대신에 main.py 함수를 실행한다. 위와 같이 하면 그것을 고칠 수 있을 것이다.그러길 바랍니다.

참조URL: https://stackoverflow.com/questions/6523791/why-is-python-running-my-module-when-i-import-it-and-how-do-i-stop-it

반응형