본문 바로가기

python

pyinstaller로 배포할 exe에 필요한 파일들 모두 포함시키는 방법

반응형

안녕하세요. 지난번에 한번 pyinstaller로 exe를 만드는 스크립트를 소개한 적이 있는데요.

이번에 어떤 작업을 하면서 겪은 문제와 해결하는 방법에 대해 기술하려고 합니다.

 

1. pyinstaller 사용하여 exe 만들기

먼저 다시 한번 리마인드 하는 차원에서 pyinstaller를 사용하여 exe 만드는 법을 적어봅니다.

먼저 Command창을 띄우고 pyinstaller가 없다면 설치합니다.

설치

그리고 다음과 같이 .py파일을 exe파일로 만들었습니다.

하나의 파일로 만들기

2. 파일을 찾을 수 없는 오류

그런데 이번에 진행한 작업중에 exe와 함께 .ini파일을 배포하여 ini파일에서 내용을 읽어야 하는 부분이 있었습니다.

코드에는 다음과 같이 되어 있었죠.

# 사용자 입력 받기
user_inputs1 = get_user_inputs('config.ini')

 

폴더에는 exe파일과 ini파일이 같은 위치에 있었습니다. exe를 더블클릭하여 실행하는 경우에는 ini파일을 잘 읽어들입니다.

 

그런데, 제가 작업스케줄러에 등록하여 특정 시간에 실행되도록 했는데, exe파일이 실행되었는데 ini파일을 찾을 수 없다은 오류 메시지가 출력되었습니다. 분명히 폴더에는 ini파일이 있는데도 말입니다. ㅡㅡ;

 

그래서 Command창을 실행하여 exe를 실행했더니 같은 에러가 발생했습니다.

Traceback (most recent call last):
File "test.py", line 71, in <module>
File "test.py", line 32, in get_user_inputs
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\xxxx\AppData\Local\Temp\_MEI152682\config.ini'
[23280] Failed to execute script 'test' due to unhandled exception!

 

3. 해결방법

이상했던 점은 오류 화면에서 No shch file ... 의 경로입니다. 내 exe가 있는 폴더의 위치가 아닌 임시폴더에서 .py가 실행되고 있는 것 같습니다. 그래서 내가 실행한 파일의 위치를 출력해보니 다음과 같았습니다. Temp 폴더의 이름은 매번 바뀌었습니다.

C:\Users\xxxx\AppData\Local\Temp_MEI152684\test.py

 

그런데 문제는 exe가 실행되며 임시폴더로 .py파일을 복사하여 실행한 것인데, ini파일은 원래 있던 exe파일 위치에 있는 것입니다. 그래서 해결할 수 있는 방법은

 

다음과 같이 pyinstaller를 사용할때 함께 배포해야 할 파일들을 설정하여 함께 묶어야 합니다.

pyinstaller --add-data "config.ini;." test.py

 

위와 같이 실행하면 dist 폴더에 test.exe 파일과 _internal 폴더가 함께 생성됩니다.

파일과 폴더를 함께 배포하고 위에서 ini를 읽던 코드를 아래와 같이 변경해주면 됩니다.

import os

script_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(script_dir, 'config.ini')

# 사용자 입력 받기
user_inputs1 = get_user_inputs(config_path)

스크립트의 절대 경로를 구하고 그 위치에서 config.ini를 읽도록 하는 것입니다. 

이렇게 하면 .py가 실행되는 위치에 config.ini 이 함께 배포되는 것이고, 같은 위치에 있는 파일을 읽어 문제가 해결되는 것입니다.

 

4. 마치며...

위의 내용이 여러분의 작업에 도움이 되었으면 좋겠습니다. 오늘도 좋은 하루 되세요~~

반응형