[pyinstaller] pyinstaller로 exe 파일 생성하기

timdalxx·2021년 12월 29일
0

PyQt5

목록 보기
1/4
post-thumbnail

사용하는 이유

대학원에서 프로젝트를 수행할 때 인공지능 모델을 포팅하여 사용하는 일이 많다. 특히 사업 과제를 수행할 때 기업에 결과물을 컴팩트하게 보여주기 위해서 별다른 라이브러리를 설치할 필요 없이 실행파일만 클릭하면 되는 환경이 필요하다. Pyinstaller로 exe 파일을 생성하면 모델을 따로 다운받아서 폴더를 설정할 필요없이 압축 해제, 클릭 한번으로 결과를 확인할 수 있다.



방법

1. Pyinstaller 설치

pip install pyinstaller
conda install -c conda-forge pyinstaller # anaconda 환경을 사용할 경우

이미 설치되어 있는 경우도 오류가 발생할 수 있으므로 사용 전에 upgrade 해주는 것이 좋다.

2. 명령어로 exe 파일 생성

pyinstaller 원하는파일이름.py

이렇게 해서 무리 없이 생성되면 참 좋겠는데, 오류가 발생할 확률이 크다. 특히 인공지능 모델을 사용한 파일을 변환할 때는 부수적으로 사용된 폴더나 라이브러리가 많으므로 실행을 시도했을 때 원하는 결과가 생성되지 않을 수 있다.



발생 오류

1. Encoding

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc6 in position 124: invalid continuation byte

처음 Pyinstaller를 설치하고 곧바로 exe 파일 변환을 시도했을 때 위와 같은 오류가 발생했다.
인터넷을 뒤져보니 보통 아래 두 가지 방식으로 오류를 해결했다.

해결 방법 1. compat.py 코드 수정

오류가 났다고 표시되는 compat.py 경로에서

out = out.decode(encoding)

🔄

out = out.decode(encoding, errors='ignore')

# or

out = out.decode(encoding, "replace")

로 수정한다.

출처: https://coding-yoon.tistory.com/30 [코딩이 재밌다!]

나는 위 방식으로 해결했다. compat.py 경로는 설치된 파이썬 버전이 여러가지일 경우 다르게 나타날 수 있다.

해결 방법 2. # -- coding: utf-8 -- 추가

pyinstaller-script.py 의 가장 윗부분에

# -*- coding: utf-8 -*-

를 추가해주면 된다.



2. import module

별다른 옵션 없이 pyinstall 명령어를 사용해서 exe 파일을 생성하면 굉장히 많은 폴더가 생성되는데, 이 때 exe 파일이 생성되는 폴더와 실제 파이썬 파일이 존재하는 폴더가 다른 경우 불러와야 하는 폴더가 exe 파일 생성시 함께 만들어지지 않아 오류가 발생할 수 있다.

해결 방법 1. 경로 변경 코드 추가

    if getattr(sys, 'frozen', False):
        # test.exe로 실행한 경우,test.exe를 보관한 디렉토리의 full path를 취득
        program_directory = os.path.dirname(os.path.abspath(sys.executable))
    else:
        # python test.py로 실행한 경우,test.py를 보관한 디렉토리의 full path를 취득
        program_directory = os.path.dirname(os.path.abspath(__file__))
    # 현재 작업 디렉토리를 변경
    os.chdir(program_directory)

출처 : https://www.zinnunkebi.com/python-exe-cwd-error/

필자의 코드의 문제는 exe가 실행되는 폴더에 사용되는 폴더들이 없었기 때문에 문제가 발생했던 것이었다. 빠르게 해결할 수 있지만 다소 정확하지 않은 방법인 2번으로 우선 급한 불을 껐다.

해결 방법 2. 필요한 폴더를 dist/파일명/ 에 복사

dist/파일명/ 폴더에는 없지만 exe 파일로 만들기 원하는 파이썬 파일에서 사용하는 폴더를 dist/파일명 폴더에 복사, 붙여넣기 해준다.

이 후에 exe 파일을 실행시켜보니 원하는 폴더에 인공지능 모델이 적용된 결과가 저장되는 것을 확인할 수 있었다.

해결 방법 3. (뇌피셜) --add-data 옵션으로 사용되는 파일 추가

--icon 파일아이콘.ico // 파일의 아이콘 설정
--noconsole // 파일 실행시 콘솔창을 안뜨게함
--onefile // 단일 파일로 만들기
--add-data 리소스파일.png // 파일을 내부에 넣어줌

pyinstaller로 exe 파일 생성시 사용될 수 있는 옵션은 위와 같다.
이 중에 add-data 로 로드되어야 하는 폴더(필자같은 경우는 saved_models..)를 추가하여 exe 변환하면 오류가 생기지 않을까하는 기대감이 있다.

이부분은 시도해보고 수정하겠다.

(추가) 정확한 방법

spec 파일에서 data = [] 부분을 datas = [('./img/*', './img')] 이런식으로 수정하고

 pyinstaller -F 파일명.spec

명령어로 업데이트 하면 된다고 한다.
출처 : https://developer-mistive.tistory.com/59

필자는 이런식으로 model과 ui를 저장해주었더니 dist 폴더에 함께 생성되었다! 다음은 파일 하나로 배포해도 다른 컴퓨터에서 잘 실행되는지 테스트해보도록 하겠다~

기타 도움된 출처:
https://velog.io/@wlxo0401/PyInstaller-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython-%EB%B0%B0%ED%8F%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-exe-%EC%8B%A4%ED%96%89-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95

Pyinstaller 를 급하게 사용하게 되어 아직 알아가는 중인데 편리하고 신기하다. 마스터가 되어서 동료 연구생들한테 알려줘야지~ 야호

profile
Major in Computer Vision

0개의 댓글