반응형

안녕하세요.

 

오늘은 필터 exe파일을 만들면서 막혔던 오류 부분을 설명하도록 하겠습니다.

 

pyinstaller는 pycharm 이나 pip를 통해 깔아줍니다.

 

pyinstaller 사용법은 아주 간단합니다.

 

pyinstaller [파일명].py

 

가장 많이 사용하는 옵션을 설명하겠습니다.

 

-w : 콘솔창을 띄우지 않습니다.

-F : 파일 하나만 생성합니다. 

 

pyinstaller -w -F [파일명].py or pyinstaller -noconsole -onefile [파일명].py

 

기본적인 사용방법입니다. (당연히 [파일명].py가 존재하는 경로에 pyinstaller를 해주어야 합니다.)

 

아마 이 글을 읽으시는 분들이 방법은 알지만 오류로 인해 검색하시다 보니 여기까지 오시게 되었겠죠?

 

대단한 것은 아니지만 제가 exe파일을 만들면서 접했던 오류들을 해결하면서 배웠던 것을 적도록 하겠습니다.

 

 

 

 

 

 

 

1. unicodeDecodeError : 'utf-8' codec can't decode byte 0xff

 

아마 utf-8 오류가 떠서 uft-8 decoding을 해주셨을겁니다.

 

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

 

아마 이 부분을 추가해주셨겠지요?

 

하지만 아쉽게도 uft-8 decoding을 해주어도 똑같은 오류가 발생합니다. 

 

이 오류가 뜨는 이유는 여러분들이 잘못을 한 것이 아니라 pyinstaller의 고질적인 문제라고 합니다.

 

https://github.com/pyinstaller/pyinstaller/pull/3895

 

Specify the utf-8 encoding when opening a text file by bjones1 · Pull Request #3895 · pyinstaller/pyinstaller

This is a fix for #3605, and generally for a number of places in the code where the encoding wasn't specified when opening a file. Since getting this working required more complexity than I exp...

github.com

Python\Lib\site-packages\Pyinstaller\compat.py

 

위 경로에 compat.py를 찾아 열어줍니다.

 

compat.py에 저 아래 라인을 수정해 줍니다.

 

out = out.decode(encoding)

 

a. 해결방법 -> out = out.decode(encoding, errors='ignore')

b. 해결방법 -> out = out.decode(encoding, "replace")

 

저렇게 수정해주시고 다시 돌려보시면 에러를 무시한채 해결됩니다.

 

 

 

 

 

 

2. import module error

 

library를 많이 쓰다 보면 module error가 발생하게 됩니다.

 

pyinstaller로 파일을 만들면은 

 

pycache

build

dist

[파일명].spec

 

이렇게 생성될겁니다.

 

[파일명].spec 을 열어줍니다.

 

[파일명].spec

hiddenimports = []

 

위 부분에 오류가 뜨는 함수를 적어주면 됩니다.

 

예를 들어

 

numpy, matplotlib가 오류가 발생한다면,

 

hiddenimports = ['numpy', 'matplotlib'] 이렇게 추가해주시면 됩니다.

 

pyinstaller가 완전한 실행 프로그램이 아니라서 오류가 많이 발생합니다.

 

저는 프로그램 만드는 것보다 exe파일 만드는 부분에 힘을 너무 많이 사용해서...

 

python이 코딩엔 상당히 강력하지만, exe나 속도는 상당히 취약합니다...

 

하지만 데이터처리나, 라이브러리이 너무 매력적이라서... 

 

pyinstaller 글을 마치도록 하겠습니다.

 

왠지 pyinstaller는 아마 계속해서 새로운 오류가 발생해서 글을 마칠 수 없을 것 같습니다 ㅎ

 

728x90
반응형
반응형

filter_adapter_application_1.py
0.00MB
setup.py
0.00MB

 

안녕하세요! 오늘은 조금 무겁게 시작하겠습니다.

 

python을 공부한지 언 3주 째 되가고 있는데...

 

이번에 처음으로 exe파일을 만들어 보았습니다...

 

python이 high level언어이지만, exe이를 만들 때는 정말 무겁다는 것을 이번에 뼈저리 느끼게 됐습니다.

 

c언어를 할 때는 디버깅을 하면 자동으로 exe만들어서 몰랐는데 파이썬은 정말 어려웠습니다.

 

많은 사람들이 pyinstaller로 exe파일을 만드시길래 저 또한 pyinstaller를 사용하였는데...

 

이틀동안 자존감이 떨어졌습니다...

 

결국 pyinstaller를 포기하고 다른 라이브러리인 cx_freeze라는 구세주를 맞이했습니다.

 

이 글은 pyinstaller에 지친 사람들을 위해 쓰는 글입니다. 

 

아! 그리고 이번에 jupyter notebook에서 pycharm으로 개발환경을 바꿨습니다. 

 

나중에 pycharm 사용법에 대해 글을 쓰도록 하겠습니다.

 

시작하겠습니다!

 

우선 cx-Freeze 깔도록 합시다. 오늘 기준으로 6.1버젼을 사용합니다.

 

cx-Freeze를 깔았다면, setup.py를 만들어야 합니다. 

 

예시로 제가 만든 프로그램을 기준으로 설명하겠습니다.

 

from cx_Freeze import setup, Executable
import sys

buildOptions = dict(packages = ["matplotlib","scipy","numpy"],  # 1
excludes = ["scipy.spatial.cKDTree"])

exe = [Executable("filter_adapter_application_1.py")]  # 2

# 3
setup(
    name= 'Filter',
    version = '0.1',
    author = "YJS",
    description = "FIlter Adapter Application",
    options = dict(build_exe = buildOptions),
    executables = exe
)

 

package은 우리가 썻던 라이브러리의 함수를 적습니다. 

예를 들어 PyQt5라이브러리를 사용했다면,

 

buildOptions = dict(packages = ["PyQt5"], excludes = [])

이렇게 넣어줍니다. 

 

혹여 제외해야할 함수가 있다면 excludes를 넣어줍니다. 

제가 만들었던 프로그램은 scipy.spatial.cKDTree가 오류가 자꾸 떠서 제외시켜 주었습니다.

 

제 친구 stackoverflow에서 찾아보니,

scipy.spatial.ckdTree와 scipy.spatialcKDTree가 이름이 겹쳐서 부딪히기 때문에 

아예 제외시켜주라던구요...

 

일단 포함할 라이브러를 package 써준 후에, 만들고 있는 도중에 해당 라이브러리에 오류가 뜬다면

excludes에 오류 부분을 넣어주면 됩니다.

 

이제 거의 다 왔습니다. 

 

exe = 자신이 exe만들고자 하는 .py 

 

setup부분에서 

name = 이름

version = 버젼

author = 만든이

description = 설명

option = buildOption =>라이브러리 추가할건지, 제외할건지

exe = 실행 파일 

 

이제 끝입니다. 

 setup.py를 만들고 exe파일을 만들 .py랑 위치를 같게 해줍니다. 

 

이제 제가 한 번 만들어 보겠습니다.

일단 오류없이 잘되네요.

 

pyinstaller는 .dll 때문에 너무 마음 고생을 했는데 ex_freeze는 그 문제를 알아서 해결해줍니다.  

 

build 파일 생겼습니다.

폴더가 생겼네용

exe파일이 있네요. lib 한 번 들어가볼까요?

라이브러리에 온통 다 들어가있네요... 이러니 무겁지..

 

하지만 안심해서는 안됩니다. 이제 exe파일을 돌려봐야 합니다. 생성됐다고 끝난 것이 아닙니다.

 

위에 matplot에서 문제가 있지만 돌아가는데에는 문제가 없네요. 

 

다음 시간에는 저희들이 cmd창에서 요즘 누가 사용합니다. 

 

ui를 포함한 것도 exe파일을 만들어 보도록 하겠습니다.

728x90
반응형

+ Recent posts