py2exe

Python : 2008. 4. 21. 19:20
반응형
출처 http://www.python.or.kr/pykug/py2exe

py2exe

py2exe는 Microsoft 윈도우즈 플랫폼에서 파이썬 프로그램을 파이썬 인터프리터가 없이도 실행할 수 있는 독립적인 실행 파일로 만들어 주는 유틸리티입니다.

버전 0.4.1부터는 COM Server에 대한 지원이 추가되었습니다. 파이썬으로 만든 COM Server를 exe나 DLL로 만들어 주는 기능을 제공합니다.

샘플 코드 1

예를 들어 myscript.py를 실행파일로 만들고 싶은 경우에, setup.py를 작성해야 합니다.

# setup.py  
from distutils.core import setup
import py2exe

setup(
console=["myscript.py"], # 도스창에서 실행할 파일을 생성할 경우
# windows=["myscript.py"], # GUI등 도스창 없이 실행할 파일을 만드는 경우
)

때로는 다음과 같은 에러 메세지가 맨 마지막에 나타나기도 하지만 대부분은 Warning 에러 메시지입니다.

The following modules appear to be missing 
['DateTime', 'cephes', 'dotblas', 'mx', 'mx.DateTime', 'wx.BitmapFromImage']

그리고 나서 다음 명령을 도스창에서 하면 dist 디렉토리안에 실행파일 myscript.exe과 DLL, pyd 파일등이 생성됩니다.

python setup.py py2exe  

- 이강성

추가의 패키지 기술하기

추가의 패키지를 실행파일로 함께 만들고 싶으면 명령행에서 다음과 같이 할 수 있습니다.

python setup.py py2exe --packages encodings,cjkcodecs 

혹은 setup.py를 다음과 같이 작성하고 그냥 python setup.py py2exe를 수행할 수도 있습니다.

# python 2.3 or below 
from distutils.core import setup
import py2exe

setup(
options = {"py2exe": {"packages": ["encodings", "cjkcodecs"]}},
console=["myscript.py"],
)

파이썬 2.4이상에서는 "cjkcodecs"은 쓰지 않아도 됩니다. 하지만 "encodings"가 없으면 "cp949" Lookup 에러가 발생합니다.

# python 2.4 or above 
from distutils.core import setup
import py2exe

setup(
options = {"py2exe": {"packages": ["encodings"]}},
console=["myscript.py"],
)

wxPython 프로그램을 실행파일로 변환했는데, 별다른 옵션 없이 잘 처리되더군요..
좀 더 자세한 사용법은
http://starship.python.net/crew/theller/moin.cgi/Py2Exe 에서 찾아볼 수 있습니다 - 이강성

최적화된 바이트 코드로 컴파일하기

다음과 같이 optimize 옵션을 이용할 수도 있지만, 이경우는 임포트 하는 모듈만 적용이 되고,
from distutils.core import setup 
import py2exe

setup(
options={"py2exe":{"optimize":2}},
console=["beep.py"]
)

다음과 같이 명령행을 입력하면 메인모듈까지 최적화된다.

python -OO setup.py py2exe  

dll파일과 library.zip파일 포함하지 않기

다음과 같이 dll_excludes 옵션을 이용하면 컴파일시 dll파일을 포함하지 않습니다.
또한 zipfile=None 옵션은 library.zip를 포함하지 않습니다.
# setup.py   
from distutils.core import setup
import py2exe

setup(
zipfile=None,
options = {"py2exe": { "dll_excludes": ["python24.dll"]}, },
console = [
{
"script": "test.py",
}
],
)

질문/답변

인코딩을 찾을수 없다고 하는데 어쩌죠?

유니코드 지원을 위해서는 encodings 패키지가 필요한데, py2exe가 의존성을 아주 잘 찾아내기는 하지만 이것을 잡아내기는 어렵습니다. 따라서 이 패키지가 필요하다고 직접 알려주셔야 합니다. setup.py 를 실행시킬 때 --packages encodings 옵션을 추가해 주면 됩니다.

자세한 내용은 py2exe 홈페이지를 참고하세요.

--feanor

유니코드로 표현된 한글에 관련된 문제라면 대부분 다음과 같은 명령행 인수로 무리 없이 수행되는것으로 보입니다.

python setup.py py2exe --packages encodings,cjkcodecs 

하지만 여전히 어떤 모듈에서 다음과 같은 에러를 발생한다면

LookupError: unknown encoding: cp949 

다음 행을 에러가 나는 소스 파일의 앞부분에 추가하면 해결됩니다.

from cjkcodecs import multibytecodec, mapdata_ko_KR, cp949, _cp949, aliases 

http://bbs.python.or.kr/viewtopic.php?t=20420 참조

또한 execfile() 를 실행하기전에는 다음과 같이 임포트합니다.

from cjkcodecs import aliases  

-이강성

WxPython?과 한글 파일 경로

WxPython?을 사용하는 프로그램을 py2exe로 패키징했을 경우 한글이 들어가는 경로에서 실행하면 코덱에서 에러가 납니다. 이 경우 wx 패키지를 임포트하기 전에 시스템 기본 인코딩을 바꿔주면 됩니다.

import sys 
if hasattr(sys, "setdefaultencoding"):
sys.setdefaultencoding(sys.getfilesystemencoding())

이에 필요한 mbcs 코덱도 같이 패키징하니 잘 돌아가는 군요.

실행시 ImportError? 가 발생합니다.

py2exe 로 패키징한 실행파일 실행시 다음과 같은 에러가 발생할 경우가 있습니다.
Traceback (most recent call last): 
File "maccheck.py", line 4, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "wx\__init__.pyo", line 45, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "wx\_core.pyo", line 4, in <module>
File "zipextimporter.pyo", line 98, in load_module
ImportError: MemoryLoadLibrary failed loading wx\_core_.pyd
일반적으로 필요한 dll 파일이 없어서 발생하는 문제로 보입니다.
py2exe 로 패키징시 마지막에 다음과 같은 메시지가 보입니다.
*** binary dependencies *** 
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

ole32.dll - C:\WINDOWS\system32\ole32.dll
OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll
USER32.dll - C:\WINDOWS\system32\USER32.dll
gdiplus.dll - c:\lang\python\lib\site-packages\wx-2.8-msw-ansi\wx\gdiplus.dll

SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
MSWSOCK.dll - C:\WINDOWS\system32\MSWSOCK.dll
WINMM.dll - C:\WINDOWS\system32\WINMM.dll
WSOCK32.dll - C:\WINDOWS\system32\WSOCK32.dll
MSVCP71.dll - c:\lang\python\lib\site-packages\wx-2.8-msw-ansi\wx\MSVCP71.dll

COMCTL32.dll - C:\WINDOWS\system32\COMCTL32.dll
ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
msvcrt.dll - C:\WINDOWS\system32\msvcrt.dll
WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
GDI32.dll - C:\WINDOWS\system32\GDI32.dll
KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll
comdlg32.dll - C:\WINDOWS\system32\comdlg32.dll
RPCRT4.dll - C:\WINDOWS\system32\RPCRT4.dll
에러가 나는 PC 에서 위에서 언급된 dll 들을 찾아서 없으면 해당 dll 을 복사해주면 됩니다.
일반적으로 msvcp71.dll, gdiplus.dll, mfc71.dll 이 자주 문제가 됩니다.
배포시 주의할 점은 위 메시지에 나온 것처럼 해당 dll 에 대한 배포권한이 있는 확인해야합니다.

그럼, 수고하세요.

참고


파이썬소프트웨어개발분류

PythonPowered 페이지고치기 (마지막 변경 2007-08-27 16:48:29)
페이지찾기 by browsing, searching, or an index
그 외에 다음 액션도 있습니다 : DeletePage, DeleteUploadedFile, LikePages, SpellCheck, UploadFile
반응형

'Python' 카테고리의 다른 글

Python 에서 구조체 쓰기  (0) 2008.04.21
Python에서 엑셀 파일 열기  (0) 2008.04.04
IronPython 에서 .Net C# 끌어 쓰기  (0) 2008.02.19
Posted by Real_G