20120224 :: py2exe의 옵션들

오랜만에 파이썬 코드 하나를 exe로 만들면서 사용한 py2exe의 옵션을 정리하는 차원에서 기록.

py2exe

py2exe는 파이썬(Python)으로 작성된 코드를 파이썬이 설치되지 않은 윈도 환경에서 바로 실행할 수 있는 실행파일로 만들어주는 도구입니다. 이 역시 별도의 어플리케이션으로 존재한다기 보다는 파이썬 모듈로 구성되어 있으며, 실행파일을 만들 때의 옵션들을 포함하는 별도의 빌드 스크립트를 짜야 합니다. 자세한 설명은 py2exe의 프로젝트 홈페이지를 참고하면 되겠습니다. 여기서는 옵션에 대한 설명을 요약합니다. 원문은 py2exe 위키에서 가져왔습니다.

옵션항목

  • console : 콘솔EXE[1. 도스 프롬프트 창이 뜨는 형태로 실행되는 프로그램]로 변환할 코드의 목록 (리스트 형태)[3. 파이썬의 리스트는 대괄호로 묶고, 각 항목은 컴마로 구분합니다.]
  • windows : 윈도EXE[2. 윈도창이 뜨는 형태로 실행되는 GUI 프로그램]로 변환활 코드의 목록 (리스트 형태). pyw의 포맷이라면 이 옵션을 선택합니다.
  • service : 윈도 서비스 클래스를 포함하는 모듈의 이름 (리스트 형태)
  • com_server : 윈도 COM 서버 클래스를 포함하는 모듈의 이름 (리스트 형태)
  • zipfile : 실행에 필요한 모듈을 zip 파일의 형태로 묶음. 값을 None으로 주면 실행파일로 묶이고 별도의 zip 파일이 생성되지 않음
  • options : 컴파일에 필요한 옵션을 지정 (사전 형태)[4. 파이썬의 사전(dictionary) 데이터는 중괄호로 묶고, 각 항목은 컴마로 구분되며, 각 항목은 콜론을 짝 지웁니다.] 사전의 형태는 options={“py2exe”:{ “옵션1″:”값1”, “옵션2″:”값2” …},}의 모양입니다.

Options

옵션 항목 중 다시 options 에서 사용되는 값들을 살펴봅니다.

  • unbuffered : 만약 true로 설정하면 표준입출력에서 버퍼를 사용하지 않는 실행 파일을 생성하게 됩니다.
  • optimize : 코드를 최적화 합니다. 0=최적화 안함 , 1=일반적 최적화, 2=추가 최적화
  • include : 포함할 모듈의 이름을 리스트 형태로 지정합니다.
  • packages : 단일 모듈이 아닌 패키지 이름을 리스트 형태로 지정합니다. 여기에 명시된 패키지는 통상 서브 패키지까지 포함합니다.
  • ignore : 패키지나 모듈을 찾다가 없으면 무시할 모듈을 명시합니다.
  • exclude : 제외할 모듈을 명시합니다.
  • dll_exclude : 제외할 DLL 파일을 명시합니다.
  • dist_dir : 최종 바이너리를 생성할 경로를 지정합니다. 기본적으로는 setup.py 파일이 실행되는 디렉토리에 dist 디렉토리를 생성하게 됩니다.
  • compressed : 압축된 zip 파일을 생성할 것인지 여부를 지정합니다. 불리언 값입니다.
  • xref : 불리언 값입니다. 교차 참조를 보여줄 것인지 여부를 지정합니다.
  • bundle_files : 번들링 여부를 결정합니다. 3=번들링하지 않음(디폴트), 2=기본번들링(파이썬 인터프리터를 포함하지 않음), 1=파이썬 인터프리터까지 번들링
  • skip_archive : 파이썬 바이트 코드 파일을 번들에 포함하지 않고 파일시스템에 직접 생성합니다.
  • ascii : (불리언) encodings, codec 패키지를 포함하지 않습니다.
  • custom_boot_script : 실행환경 세팅 후 실행할 파이썬 코드를 명시합니다.

별도의 예제는 표시하지 않습니다. 다만 단일 실행 파일을 생성하는 법을 안내하는 예전 포스팅을 링크합니다.

 

20091204 :: py2exe로 단일 실행 파일 만들기

이전에도 한 번 py2exe 모듈을 사용해서 파이썬 스크립트를 실행가능한 exe 파일로 만드는 부분에 대해서, 언급을 한 적이 있지요. 이렇게 py2exe를 사용하여 실행파일을 작성하면 파이썬 인터프리터가 lib 형태로 함께 만들어집니다. 이 것을 하나의 단일 실행 파일로 만드는 방법을 소개하고자 합니다.

py2exe를 사용하여 빌드 스크립트를 작성할 때 option 값 내에 py2exe 부분에 bundlefiles 옵션을 1로 주게되면 모든 파일을 하나로 묶어주게 됩니다. 여기에 zipfile=none 옵션을 주면 이러한 묶어진 파일이 실행 파일 내부로 들어가게 되지요.

이와 별도로 dll 파일들은 실행 파일 내에 포함이 되지 않는 듯 합니다. NSVCR71.dll 파일 같은 경우는 매우 빈번히 dist 디렉토리에 같이 들어가더군요.

아래 예제를 샘플 삼아 작성해 보시면 됩니다.

#-*-coding:utf-8
#setup.py
from distutils.core import setup
import py2exe, sys

sys.argv.append("py2exe")

setup(console=["somefile.py"],
options={
    "py2exe":{
        "packages" : ["pywinauto", "pywinauto.controls", "pywinauto.application"], "bundle_files":1,
        "optimize":2, 
        } 
    }, 
    zipfile = None 
)

Cruithne님이 지적해 주신 코드 내 오타 수정하였습니다. 감사드립니다. (11.07.10)

20090208 :: py2exe로 배포판 만드는 요령

사무실 컴퓨터에 접속하기 위해 vpn 연결을 자동으로 만들어주는 파이썬 스크립트를 하나 만들어서 사용 중인데, 나름 꽤 유용하게 잘 쓰고 있습니다.  자동으로 세팅값을 맞출 수 있도록 심혈을 기울여 제작한 탓에 파이썬과 pywinauto 모듈만 설치하면 노트북을 갈아 엎더라도 VPN 클라이언트 설정을 자동으로 복구해 주니 참 편하게 쓸 수 있더군요. 그런데 가끔은 제가 늘 쓰던 노트북이 아닌 다른 노트북을 가지고 다닐 경우도 있고 한데, 그 때마다 파이썬을 다 설치할 수도 없는 노릇이고 해서 아예 실행 파일 형태로 만들어서 USB 메모리에 넣어다니는 것이 어떨까 하는 생각이 들더군요.

그래서 py2exe라는 녀석을 찾았습니다. 음.. 모듈을 설치한 후에 따로 setup 스크립트를 만드는 것이 조금은 이해가 안 갔습니다만 몇 가지 테스용 스크립트를 만들어서 시도해보니 이것도 꽤 신기하더군요.

아무튼 py2exe의 사용법은 대략 다음과 같습니다.

먼저 setup.py 파일을 작성합니다. 당연히 파일 이름은 setup.py가 아니어도 상관없습니다. 내용은 다음과 같습니다.

 

from distutils.core import setup
import py2exe

setup(console=[“exe로 만들 스크립트.py”])
 

이렇게 하고 setup.py로 저장한 다음(exe로 만들 스크립트와 같은 폴더에 넣어둡니다.) 도스 프롬프트 상에서 다음과 같이 입력합니다.

> python setup.py py2exe

몇 가지 간단한 스크립트를 만들어서 해보니 배포해야할 폴더의 크기가 어마어마 하다는 점에 깜짝 놀랐지만, 그래도 exe파일로 만들어 지는 것이 꽤 신기했습니다. 그래서 이번에는 vpn연결을 해주는 스크립트를 위해 setup.py 파일을 작성하고 실행했습니다… dist 폴더 내에 exe 파일은 정상적으로 만들어 졌지만 실행하니 뭔가 안됩니다. 그냥 콘솔 창이 아주 빠르게 떴다가 없어져 버리는 군요. 구글링을 통해 간단히(?) 답을 찾았습니다. py2exe를 위한 스크립트의 옵션은 그 형태가 매우 심오한 듯 합니다. 대충 아래와 같이 만들어서 성공했습니다.

from distutils.core import setup
import py2exe

setup(console = [‘vpn.py’],
        options={
                “py2exe“:{
                         “packages“:[“encodings“,”pywinauto“,”pywinauto.controls“,”pywinauto.application“], } #사용된 모듈들을 적어준다.
                  }
        )

 오 재밌네요. 그리고 wxPython을 사용한 GUI 프로그램의 경우는 조금 특이한데요. 유형이 다음과 같습니다.

from distutils.core import setup
import py2exe

setup(windows=[{“script” : “wx_logextractor.pyw“}],
        options={
                “py2exe“:{
                        “packages” : [“encodings” , “wx“,]}
                }
        ) 

이렇게 하고 나니 정상적으로 되는 듯 했습니다만, msvcp71.dll 파일이 없다고 합니다. 해당 파일은 dist 폴더에 복사해서 넣어주면 됩니다. 한가지 신기한 것은 제 시스템에도 msvcp71.dll이 설치되어 있지 않는데 pyw 그 자체로 실행했을 때는 잘 실행 된다는 점입니다. (그나저나 이런 dll 파일을 함께 패키징 할 수 있도록 하려면 스크립트에 어떤 내용을 추가해야 하는지 아시는 분 혹시 있으신가요?)