기본 콘텐츠로 건너뛰기

Featured Post

영어회화 빨리 느는 방법 3가지

파이썬 실행파일 만들기(cx_Freeze활용)

How to create .EXE file in Python using cx_Freeze

파이썬은 웹서버를 할당하거나 소유하고 있는 기기에서 실행하는 용도로 프로그래밍하기에 매우 좋다. 하지만 만든 어플을 친구나 사용자에게 배포하려하면 매우 성가시다.
- "이거 동작하지를 않아. 어떻게 실행하는지 모르겠어"
- "너 Python Interpreter 설치 했어?
- "아니, 그게 뭔데?"
- "너 그걸 설치해야 실행할수 있어. www.python.org 여기서 *.*version을 받아"
- "아 그래? 나 그냥 다른거 사용할께"

보통 이런 상황이 펼쳐진다. 만약 본인이 만든 소프트웨어를 Python을 사용하는 개발자에게 전달하는게 아니라면, 실행가능한 패키지를 선호할 것이다. 추천하는 해결책은 cx_Freeze이다. py2exe와는 조금 다르다. 이것은 교차 플랫폼(cross platform)이다. 윈도우나 OSX, Linux 환경의 패키지를 빌드하는데 사용된다.
이 포스트는 어떻게 3가지 플랫폼환경에서 PyQt4 GUI 어플을 패키지하는지 설명하려 한다. 사용할 샘플 어플은 PyQt4 설명서(www.zetcode.com)에 있는 테트리스 복제(Tetris clone)이다. 이곳(http://zetcode.com/gui/pyqt4/thetetrisgame/)으로 가서 게임의 모든 코드를 복사하고 tetris.py 파일로 저장한다.
아래 명령어로 cz_Freeze를 설치한다.
pip install cx_Freeze




설치가 완료되면 아래와 같이 확인 할 수 있다.


이제 tetris.py가 저장되어 있는 디렉토리로 이동하고 초기 setup.py을 생성하기 위해 quickstart 명령어를 실행한다.
cxfreeze-quickstart

setup.py는 cx_Freeze에게 어플을 어떻게 패키지할 것인지 설정하는 스크립트로 구성된다. 몇몇 정보를 입력해야 하는데 Python file을 무엇으로 실행할 것인지 스크립트의 이름을 입력한다. 이것은 tetris.py로 입력한다. 이렇게 만들어진 setup.py 아래와 같다.
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need
# fine tuning.
buildOptions = dict(packages = [], excludes = [])
import sys
base = 'Win32GUI' if sys.platform=='win32' else None
executables = [
    Executable('tetris.py', base=base)
]
setup(
    name='Tetris',
    version = '0.1',
    description = 'A PyQt Tetris Program',
    options = dict(build_exe = buildOptions),
    executables = executables
)

중요한 코드에 대해서 알아본다.
buildOptions = dict(packages = [], excludes = [])
build option은 파이썬이 어떤 패키지, 어떤 모듈 그리고 어떤 다른 파일(non-Python files such as assets)을 패키지 어플에 포함하는지 제어한다.
cx_Freeze는 패키지 어플을 만들 때 뭐가 필요되어지는지 해결하려고 시도하지만, 프로그램에서 다양한 모듈이 Impor(import sys, os 등) 로 사용되었다면 사용자가 직접 특정 구성요소를 입력해야 할수 있다.

"packages"와 "excludes"는 자동으로 생성된 빌드 옵션 사전에 포함된다. 다른 추가적인 주요 요소는 "includes" 와 "include_files"이다. "includes"는 포함 될 필요가 있는 모듈 리스트를 갖고 include_files는 파이썬 파일이 아닌 파일 리스트를 갖는다.(아래 참고)
buildOptions = dict(packages = [],excludes = [],
    includes = ["atexit"],
    include_files = ["sqlite.db"])

다음 관심이 갈만한 줄은 아래이다.
base = 'Win32GUI' if sys.platform=='win32' else None
Window, GUI 어플은 다른 파이썬 기반을 요구한다. 해당 어플은 pythonw.exe interpreterd으로 실행되어지거나 명령어로 실행하고 프로그램 수행 동안 실행되는 상태를 유지한다.

setup.py를 좀더 살펴보면 아래 줄을 볼수 있다.
executables = [Executable('tetris.py', base=base)]

cxFreeze.Excutable class의 경우는 프로그램의 메인 시작 파일을 예로 들어 설명하기로 한다.
일반적으로 하나의 실행파일을 가지지만, 더 많은 실행파일을 가질수도 있다. 이 경우 명령어 도구 모음(a suite of command line tools)을 패킹한다. 사용자가 설정한 빌드 옵션 내용과 프로그램 이름, 버전, 설명등 다른 설정사항을 거쳐 파일의 마지막 부분은 셋업 기능을 호출한다. tetris.py 스크립트를 위해 setup.py를 고칠필요는 없다. set up을 실행하는 것으로 패키지 빌드를 진행할수 있다.
python setup.py build
이 명령어는 프로젝트 하위에 새로운 'build' 디렉토리를 생성할 것이다. 이후에 exe파일이 담길 폴더가 생성되고 잇따라 사용자의 현재 플랫폼의 이름과 같이 생성된다. 빌드가 중복없이 다양한 플래폼에 대해 수행되어 질수 있도록 이와같이 진행된다.플렛폼 하위 폴더에서 실행 파일을 찾을수 있다.



cx_Freeze에 몇몇 드러난 문제점이 있다. 사용자가 빌드 커맨드를 실행할때, 어떤 import들은 정의되지 않았는데도 빌드가 완료될 것이다. 문제가 되지 않는 경우도 있지만, 모든 파일들이 패키지에 확실히 포함되었는지 확인해야만 한다. 빌드 명령어는 플랫폼 폴더에 전부 쏟아 넣는다. Linux를 위한 패키징할때는 a .tar.gz 형식을 추천하지만 OSX와 Windws는 특정 패키징 명령어를 써야한다.

OSX는, a.dmg 또는 a.app 형식의 두가지 빌드 옵션을 갖는다.(아래 참고)
python setup.py bdist_dmg
python setup.py bdist_mac

Windows는, a.msi 형식으로 빌드한다.(아래 참고)
python setup.py bdist_msi

안타깝게도, 하나의 플랫폼환경에서 다른 형식의 파일로 빌드하지 못한다. windows는 windows에 맞게 OSX는 OSX에 맞게 빌드할 수있다. 하지만 setup.py파일은 공용된다.
끝내기전에, 패키지된 어플안에 접근파일에 대해서 언급하려 한다. 패키지 파일이 실행될 때, global__file__변수는 적용되지 않는다. 사용자가 os.path.dirname(__file__)를 사용해서 현재 경로에서 잡으려 한다면 동작하지 않을 것이다. os.path.dirname(sys.executable)을 사용해야한다. 다행히, 패키지 어플이 실행될때, sys안에 "frozen" 속성은 가능하다. 사용자는 어플이 실행중이건 아니건 상관없이 파일을 제어하기위해 해당 속성을 사용할 수 있다.

cx_Freeze Documentation은 이 기능을 시작 점으로 명시했다.
def find_data_file(filename):
    if getattr(sys, "frozen", False):
        # The application is frozen.
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen.
        datadir = os.path.dirname(__file__)
    return os.path.join(datadir, filename)

사용자는 이 기능을 executable처럼(not in a subdirectory) 사용자 데이터 파일이 저장된 상태에 맞게 약간 수정할 필요가 있다.

댓글

댓글 쓰기

이 블로그의 인기 게시물

스티브 잡스 명언 영어 세상에서 가장 감명 깊은 어록 25가지

"Sometimes Life is going to hit you in the head with a brick. Don't lose faith." "때때로 인생은 당신을 심하게 내두를 것이다. 스스로의 믿음을 잃지 마라."   대부분의 사람들은 적당히 즐기고, 적당히 게으르고, 어렵고 힘든 것은 피하고 싶어 한다. 그들이 무지함과 가난에서 벗어나지 못한 것이 그 이유이다. 반대로 큰 성공을 이룬 후에도 스티브잡스는 "내일 죽는다면"이라는 생각으로 극단적 이리만큼 스스로를 동기부여했다. 무엇인가 이룰 수 있는 사람은 그럴만한 자세가 있다.   스티브 잡스가 남긴 어록 중에 사람들이 가장 감명받은 25가지를 선별해 한글로 번역했다. 스티브 잡스 명언 영어  1  "The people who are crazy enough to think they can change the world are the ones who do." 세상을 바꿀수 있다고 생각하는 제대로 정신나간 사람들이 세상을 변화시킨다.  2  "I've always been attracted to the more revolutionary changes. I don't know why. Because they're harder. They're much more stressful emotionally. And you usually go through a period where everybody tells you that you’ve completely failed." 나는 항상 혁신적인 변화를 쫓아왔다. 그건 더 어려웠기 때문인지 모른다. 혁신은 감정적으로 굉장히 압박이 심하다. 그리고 모든사람들이 당신에게 완벽히 실패했다고 이야기 하는 시기를 이겨내야 한다.  3  "It's really hard to design products b

영어숙어 100가지 필수 암기해야 하는 표현 모음

 영어 숙어(idiom)란 두 개 이상의 단어로 이루어져 사용되면서 한 단어처럼 해석되는 단어이다. 예로 'get in'은 두 개의 단어가 결합되어 '타다, 들어가다'라는 의미를 지니며 한단어처럼 사용한다. 관용구의 한 종류이며 많이 사용하여 익숙해져서 생긴 말들을 말한다.  원어민들의 영어를 접하다 보면 알아듣기 힘들거나 잘못 이해하는 경우가 많이 있는데 이런 경우는 대게 숙어와 같은 관용구가 들어간 문장을 접했을 때이다. 영어 공부를 할 때에는 단어만 외우는 것보다 문장이나 숙어를 암기하는 것이 중요하다.  이 글에서는 필수 암기해야하는 영어 숙어 100가지 를 모아서 정리했으며, 더 많은 영어 숙어는 아래 글에서 외우기 쉽게 정리했다. 영어숙어 100가지 전치사+명사 형태의 숙어로 명사나 문장 뒤에서 꾸며주는 역할을 한다. ex) I recommend that the work (should) be done at once . 나는 그 일을 즉시 처리하도록 권한다. at once - 즉시 at the end of the month - 월 말에 at a surprisingly fast pace - 놀랄만한 속도로 at first - 처음에 at least - 최소한, 적어도 at random - 임의로, 무작위로 at all times - 항상 in print - 발간되고 있는 beyond control - 통제 불능의 out of control - 통제 불능의 in effect - 유효한, 효력이 있는 in advance - 사전에, 미리 ahead of time - 사전에, 미리 in a row - 줄줄이, 연달아 with care - ~조심스럽게 with high unemployment rates - ~높은 실업 상황 하에서 with a few exceptions - ~을 제외하고 명사+전치사 형태의 숙어로 뒤에 명사나 동명사가 온다. ex) Staff were asked to

영어 회화 패턴 200가지와 원어민이 자주 쓰는 문장 모음

이번 포스트는 영어 회화 패턴 200가지 시리즈 2번째 입니다. 영어 패턴을 원어민들이 자주 쓰는 문장과 함께 정리하여 쉽게 공부할 수 있습니다. 아래 무료 영상을 재생하고 따라 말하면서 연습하세요. 원어민들이 자주 쓰는 영어 문장 모음 Sentence structure 1 I have to… 난 ~ 해야 해 I have to get this done today. 난 오늘 안에 이거 끝내야 돼요. I have to make new plans for the New year. 난 새해를 위해 계획을 세워야 해요. I have to admit that Korean students are really brilliant and hard-working. 난 한국 학생들이 똑똑하고 성실하다는 건 인정해야 해요. Sentence structure 2 I don’t have to… 난 ~ 할 필요 없어 I don’t have to hand this in today. 나 오늘 이거 제출할 필요 없어요. I don’t have to protect her. 난 그녀를 용서할 생각 없어요. I don’t have to go to school tomorrow. 난 내일 학교 안가도 되. 위문장에서 don't는 do not의 축약형입니다. Sentence structure 3 I’m gonna have to… 난 ~ 해야 할 거야 I’m gonna have to tell her how I feel. 내 감정을 그녀에게 말해야겠어. I’m gonna have to wear thick clothes. 난 두꺼운 옷을 입어야 할 거야. I’m gonna have to study for my exam this weekend. 난 이번 주말에 시험공부를 해야 할 거야. 위문장에서 gonna는 going to의 회화식 표현으로 외워야 할 영어 문장입니다. 원어민들은 대화할 때 going to로 발음하지 않고 빠르