기본 콘텐츠로 건너뛰기

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

영어 8품사의 문장 구조를 예제로 쉽게 이해하자

1. 영어 8품사 정리  영어 8품사(The 8 parts of speech)란 명사, 대명사, 동사, 형용사, 부사, 전치사, 접속사, 감탄사 를 말하며, 동일한 의미나 기능을 하는 낱말들을 8가지로 분류한 것이다. ① 명사(NOUN) - 사물의 이름으로 사람, 장소, 생물/무생물, 추상적 개념 등 생각해 낼 수 있는 모든 것의 이름이다. 영어에서 명사는 셀 수 있는 명사와 셀 수 없는 명사로 나뉘는데, 셀 수 있는 명사는 단수, 복수에 따라 낱말이 달라지는데, 대게 단어 뒤에 "(e)s"가 붙는다. - 셀 수 있는 명사 ex) book → books, pen → pens, dog → dogs, table → tables, party → parties, woman → women ... - 셀 수 없는 명사 ex) coffee, computer, love, water, family, money, information ... ② 대명사(PRONOUN) - 문장에서 명사 대신 사용한다. 대화나 글에서 사람, 사물 등을 '그녀', '저것'등으로 대신 쓰는 것을 대명사라고 한다. ex) I, you, he, she, it, that, none ... ③ 동사(VERB) - 사람, 사물의 동작이나 상태를 나타내는 품사로 문장에서 필수로 들어간다. 현재시제 3인칭 단수면 동사 뒤에 대게 '(e)s'가 붙는데, 3인칭 단수란 I, You, We를 제외한 다른 인물이나 사물이다. 복수가 아닌 단수를 말하고 현재시제는 미래나 과거가 아닌 현재를 말한다. 또한, 표현하려는 문장이 과거면 동사 뒤에 대게 (e)d가 붙는다. - 현재시제 ex) agree, stay, find, ask, eat, access ... - 3인칭 단수 ex) agrees, stays, finds, asks, eats, accesses ... - 과거시제 ex) agreed, stayed, foun

가산명사 불가산명사를 예제로 쉽게 이해하자

What are the singular and plural noun?  개수를 셀 수 있는 사물을 가산명사라고 하고, 개수를 셀 수 없는 사물을 불가산명사라고 한다. 영어에서는 셀 수 있고 없고에 따라 분류하며, 명사와 동사의 형태가 달라지고 상황에 따라서 한정사도 다르게 사용해야 한다. 한국인, 일본인 등을 포함한 한자문화권에서는 이 부분을 따지지 않는 데 영어는 이걸 굉장히 철저하게 따지며 셀 수 있나 없나에 따라 문법적인 요소가 굉장히 갈리기 때문에 영어를 배울 때 상당히 난항을 겪는 부분이다. TOEIC 등 영어 시험에서도 단골 파트 영역을 차지하고 있다. 예를 들어, 'water'는 셀 수 없지만 물병에 담겨 있는 'a bottle of water'는 셀 수 있는 가산명사이다. 하지만 실제 영어 회화에서는 Native Speaker가 편의상 '2 water'라고 쓰는 경우도 있다. 이를 틀렸다고 말할 수는 없지만 영어 학습지나 시험과 같은 공식적인 영어에서는 삼가야 한다. 아래 링크를 클릭하면 가산명사와 불가산명사에 대한 더 많은 단어를 다뤄서 참고하기 좋다. https://koonhous.tistory.com/entry/countable-and-uncountable-noun 1 가산명사(셀 수 있는 명사)  1개, 2개, 3개 이런 식으로 셀 수 있다는 걸 말하는데 한글이나 영어나 셀 수 있는 종류에는 많은 차이가 없기에 큰 문제가 되지는 않는다. 가산명사가 훨씬 더 많아서 불가산명사 빼고 다 가산명사라고 생각해도 무방하다. 영어권 원어민 강사들은 사고방식으로 이를 간단하게 구분하는 방법은 대상을 반으로 잘라보면 된다. 그다음 대상이 가진 기능이나 모양이 망가진다면 가산 명사이며, 그 기능이나 모양이 망가지지 않거나 나누기 애매한 것이라면 불가산 명사라고 보면 된다. 가산명사에만 단수·복수의 구분이 있고 단수일 때는 반드시 부정관사(a/an)와 같은 한정사(the, my, this)가 필요