Onik Lab.

pyi_rth__tkinter 오류가 뜬금없이 생길 때

May 17, 2022 | 2 Minute Read • 0 Comments

멀쩡하게 잘 돌아갔던 프로그램이 몇 차례 개선을 거치고 나서 갑자기 정상적으로 실행이 되지 않을때, 도대체 왜 이런 일이 생기는 것일까 하는 의문을 가질 수 있을 것입니다.

더군다나 Python 스크립트를 통해서 실행하면 정상적으로 실행되는 반면, PyInstaller를 사용해서 생성된 EXE를 실행하면 정상적으로 실행되지 않는 경우를 볼 수 있을 것입니다.

하지만 이전 버전에서는 PyInstaller를 실행해도 잘 돌아갔던 프로그램이 개선된 버전에서 돌아가지 않는다, 하물며 PyInstaller에서는 어떤 옵션도 추가하거나 변경하지 않았다면? PyInstaller 문제라고 보기도 어렵겠죠.

그리고 아래와 같은 메시지가 나타났다면. 이게 도대체 무슨 문제인가 할 수밖에 없을 것입니다.

Traceback (most recent call last):
  File "Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth__tkinter.py", line 25, in <module>
FileNotFoundError: Tcl data directory "D:\workspace\PyXenManager\dist\onTunePyXenManager\data\tcl" not found.

PYI_RTH__TKINTER Error

그렇다면 어디에서 에러를 찾아야 할까요. 다시 소스코드로 돌아갈 수밖에 없겠죠.

Solution

해결책은 의외로 간단했습니다. 소스코드에 아래와 같은 부분이 발견되었으니까요.

Python Source Code

네. 갑자기 모듈에 tkinter가 뜬금없이 추가된 것을 확인할 수 있습니다.

도대체 왜 추가가 됐을까요. 그것은 바로..

from tkinter import E

맨 오른쪽의 ‘E’에 주목할 수밖에 없을 것입니다.

VSCode 또는 다른 IDE를 써서 개발을 진행한다면 자동완성이 되는 경우를 흔하게 겪을 수 있을 것입니다. 그리고 저 ‘E’라는 것은 Exception 처리를 할 때 흔히 쓰는 변수명이겠지요.

except Exception as e:

이런 형태로 말이죠.

그런데 저것을 막 추가하고 입력하고 하다가 수정하고 하는 과정에 저 ‘E’라는 모듈이 자동으로 추가가 되었을 수 있고, 추가된 위치는 다름아닌 파일의 최상단에 위치하기 때문에 그것을 찾아내기는 힘들 것입니다.

해결책은 간단합니다. 저 사용하지도 않는 tkinter 모듈 import 부분을 지우면 됩니다.

지우고 다시 PyInstaller로 exe를 만들어서 실행해보세요. 정상적으로 될 것입니다.

Good Luck.

Why?

그렇다면 왜 이런 일이 생긴 것일까요?

바로 에러 메시지와 같이 TCL Data Directory가 없다고 하여 에러가 발생했기 때문이겠죠.

솔직히 tkinter가 뭔지 모릅니다. 별로 궁금하지도 않고 사용할 일도 없을 것 같습니다. 다만 한 가지 확실한 것은 그냥 Python 스크립트로 실행하면 정상적으로 되지만, EXE 파일로 생성하려면 모듈도 같이 컴파일을 해야 할 것이고, tkinter 모듈의 경우에는 TCL Data Directory 생성 컴파일까지 같이 해야 하는데 그것이 정상적으로 이루어지지 않았기 때문에 생긴 에러입니다.

그러나 아마도. Python 개발을 하다가 저런 에러가 발생한다면, 확신컨데 아마 90% 이상은 그냥 코딩 중 발생한 오류로 인해서 tkinter 모듈이 뜬금없이 추가되었기 때문에 발생한 에러가 아닐까 싶습니다.

이 점 참고하시고.

import로 불러오는 소스부터 확인하면 좋겠습니다.