스택큐힙리스트

Python을 가져올 때 왜 내 모듈이 실행되고 어떻게 멈출 수 있을까요? 본문

카테고리 없음

Python을 가져올 때 왜 내 모듈이 실행되고 어떻게 멈출 수 있을까요?

스택큐힙리스트 2023. 11. 8. 11:56
반응형

나는 파이썬 프로그램을 만들고 있는데, 두 가지 방법으로 실행할 수 있습니다.


첫 번째 방법은 python main.py를 호출하여 사용자에게 친절한 방식으로 입력을 받은 다음, 사용자 입력을 프로그램을 통해 실행하는 것입니다. 두 번째 방법은 python batch.py -파일-을 호출하여 친절한 입력 수집 과정을 거치지 않고 한 번에 전체 파일의 입력을 프로그램에 전달하는 것입니다.


문제는 batch.py를 실행할 때, main.py에서 몇 가지 변수/메서드 등을 가져 오는데, 프로그램의 첫 줄에 위치한 다음 코드를 실행할 때 바로 오류가 발생한다는 점입니다:


import main

나는 가져온 main 모듈에 포함된 코드를 실행하지 않도록 어떻게 할 수 있을까요?

답변 1

이것은 파이썬 동작 방식에 따른 것입니다. 예약어인 classdef는 선언이 아니라 실행되는 실제 명령문입니다. 이러한 명령문이 실행되지 않으면 모듈은 비어있게 됩니다.


이를 구현하는 관용적인 방법은 다음과 같습니다:


# class/def 등 항상 실행되어야 할 부분
def main():
pass
if __name__ == __main__:
# 'import'를 통해 호출되지 않을 때만 실행되어야 할 부분
main()

그러나 모듈이 가져온 소스에 대한 소스 제어가 필요합니다.

답변 2

파이썬은 모듈을 임포트할 때 그 모듈을 실행하는 것이 기본 동작입니다. 이 동작은 파이썬의 장점 중 하나로, 모듈이 임포트될 때 해당 모듈에서 정의된 코드의 일부 또는 전체를 실행하여 모듈이 기대한대로 작동하는지 확인합니다. 하지만 때로는 모듈이 실행될 필요 없이 단순히 사용하고 싶을 때도 있습니다.
파이썬은 __name__이라는 특별한 변수를 제공하는데, 이 변수는 모듈이 직접 실행될 때 __main__으로 설정되며, 다른 모듈에 임포트될 때는 모듈의 이름이 할당됩니다. 따라서 이 변수를 사용하여 모듈이 실행되는지 아니면 임포트되는지를 확인할 수 있습니다.
모듈이 임포트될 때 실행되는 동작을 원하지 않는다면, 모듈의 코드를 다음과 같이 수정하십시오:
```python
def main():
# 모듈 실행 코드
if __name__ == __main__:
main()
```
위와 같이 모듈의 실행 코드를 main() 함수 내에 넣고, __name__ 변수가 __main__인지 확인하여 main() 함수를 호출하는지 확인합니다. 이렇게 하면 모듈이 다른 모듈에서 임포트될 때는 main() 함수가 실행되지 않습니다. 대신, 모듈을 직접 실행할 때만 main() 함수가 실행됩니다.
따라서, 파이썬에서 모듈이 임포트될 때 실행되는 동작을 제어하기 위해 위와 같은 방법을 사용할 수 있습니다. 이러한 기능을 활용하면 모듈을 더욱 유연하게 임포트하여 사용할 수 있습니다.

반응형
Comments