본문 바로가기

Python

[cx_Freeze] exe 파일 배포 시 에러 해결

두 개의 파일을 만들어 간단히 예제를 만들어보았다.

 

① classify.py

import numpy as np
import pickle
import os
import keras
import sys

② setup.py

import sys
from distutils.core import setup
from cx_Freeze import setup, Executable
import os

buildOptions = dict(packages = ['sys','os','keras','multiprocessing.pool','numpy','pickle'],
                   excludes = [],
                   includes = [])
                   
base = "Win32GUI" if sys.platform == "win32" else None
exe = [Executable('classify.py', base=base)]

setup(name = "cnn",
      version = '1.0',
      description = 'Parser',
      options = dict(build_exe = buildOptions),
      executables = exe)

하나의 폴더 아래 두 개 파일을 생성하고,  "python setup.py build" 명령어로 classify.py 파일을 exe파일로 만들어준다.

exe 파일은 build/exe.win-amd64-3.5 폴더 내 생성되었다.

이 exe 파일을 실행하는데 발생한 에러를 해결한 방법에 대해 정리해보았다.

 

 

 


 

1. dll 파일이 없다고 할 경우


--> 파이썬 경로 아래 DLLs 폴더를 복사하여 가상 환경 폴더 아래 붙여 넣기 한다.

 

 

 

 

 

2. ImportError: No module named 'multiprocessing.pool'


 

위와 같은 에러 창이 뜬다. 실제로 build/exe.win-amd64-3.5/lib/multiprocessing 폴더 안으로 들어가 보면 pool이 아니라, Pool.pyc가 저장되어 있다. 이를 pool.pyc로 이름을 바꿔주면 에러 해결.

 

 

https://github.com/anthony-tuininga/cx_Freeze/issues/353

 

ModuleNotFoundError: No module named multiprocessing.pool · Issue #353 · anthony-tuininga/cx_Freeze

Hi, i'm trying to use cx_freeze with sklearn package. I use the multiprocessing.pool package and so far, tell cx_freeze to import by putting it on the package list in my setup.py. But, i've...

github.com

 

 

 

 

3. AttributeError: 'NoneType' object has no attribute 'write'


가장 해결하기 어려웠던 에러였다. 아래 말들을 참고하며 뭔지 제대로 이해하기 어려웠으나 Win32GUI에서 sys.stderr에 write가 안된다는 것을 알 수 있었다.

 

 

The bigger issue there is that anything that attempts to show a warning will cause an error, because by default it tries to write warnings to sys.stderr, and if you use the Win32GUI base, there's no stderr to write to. Calling warnings.simplefilter('ignore') beforehand should prevent that.

(https://stackoverflow.com/questions/35772441/cx-freeze-showwarning-attributeerror-nonetype-object-has-no-attribute-writ)

 

Thomas K - That was the solution to the problem.

"If you freeze it with the GUI base so there isn't a command prompt when you run it, you shouldn't write to sys.stdout or sys.stderr at all. They are for the command prompt, so if you don't have a command prompt, they won't work. – Thomas K 11 hours ago"

Thanks!

(https://stackoverflow.com/questions/30540966/python-3-cx-freeze-win34gui-issue)

 

 

--> 그렇게 하여, 최종적으로 setup.py를 다음과 같이 수정하였더니 다행히도 문제가 해결되었다.

 

import sys
from distutils.core import setup
from cx_Freeze import setup, Executable
import os

buildOptions = dict(packages = ['sys','os','keras','multiprocessing.pool','numpy','pickle'],
                   excludes = [],
                   includes = [])
                   
#base = "Win32GUI" if sys.platform == "win32" else None
#exe = [Executable('classify.py', base=base)]
exe = [Executable('classify.py')]

setup(name = "cnn",
      version = '1.0',
      description = 'Parser',
      options = dict(build_exe = buildOptions),
      executables = exe)

 

 

4. ImportError: No module named google


--> site-packages/google 경로에 __init__.py 파일이 빠져있어서 빈 __init__.py 파일을 생성했더니 해결되었다.

 

 

 

- 끝!