안녕하세요.
pyinstaller로 실행파일을 만들고 ctrl + c 눌러 종료할 때 보통 아래와 같은 메시지가 나타납니다.
종료할 때 깔끔하게 끝나지 않고 조금 애매하게 종료되는 것 같아서 조금 찾아보았습니다.
1. 테스트 환경
- HW : Raspberry Pi CM4
- OS : bookworm 64bit
- SW :
pip install pyinstaller로 인스톨러를 설치
2. 에러(?) 현상
Python 파일로 실행할 경우 문제없이 종료됩니다. 메모리 혹은 특정 리소스를 점유하고 해제가 필요한 코드에서 에러가 발생하는 것으로 생각됩니다. 현재 시점에서 [PYI-3170:ERROR]로 구글링해도 많이 나오지 않았습니다.
pyinstaller python 프로그램으로 만든 후 종료 시 리소스들도 반환하고 종료를 한 것 같은데 아래와 같이 에러가 발생했습니다.
example)
$ pyinstaller --onefile <flow_main.py >
$ ./flow_main
[에러 메시지]
^CStopping Server...
Server stopped and resources cleaned up.
Traceback (most recent call last):
File "flow_main.py", line 109, in <module>
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "flow_main.py", line 112, in <module>
KeyboardInterrupt
[PYI-3170:ERROR] Failed to execute script 'flow_main' due to unhandled exception!
3. 해결 방안
KeyboardInterrupt 예외를 try...except로 명시적으로 처리하여 Ctrl + c를 눌렀을 때 발생하는 문제를 방지합니다.
import sys를 한 후 sys.exit(0)를 호출하여 정상 종료를 명확히 합니다.
예기치 못한 다른 예외는 except Exception as e로 처리하고 여기도 sys.exit(1)로 이상 종료를 명확하게 종료합니다.
import sys
...
try:
while True:
print("Test Message")
time.sleep(2)
except KeyboardInterrupt:
print("Stopping Server...")
except Exception as e :
print(f"An unexpected error occurred : {e}")
sys.exit(1)
finally:
# Resource Clean up
sys.exit(0)
PyInstaller로 번들링 한 실행 파일은 __main__ 섹션을 기반으로 동작합니다. 실행 파일 내부에서 KeyboardInterrupt를 적절히 처리하지 않으면 PyInstaller가 내부적으로 KeyboardInterrupt를 처리하려다 실패할 수 있는 듯합니다.
위와 같이 명시적으로 처리하면 문제가 해결되는 듯합니다. 완벽하게 이것이 해결방법이라고 확신하지 못해서 '듯합니다.'라고 마무리 지었습니다. 이런 방법도 있겠구나 정도 참고하면 어떨까 합니다.
감사합니다.