build::cxfreeze

Project

Project는 binary로 배포 된다.
$ pip install cx_freeze
$ 
file project
project: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
  • binary 파일의 배포는 source code에 대한 '확인/수정'이 어렵기에 보안상 더 안전하다고 볼 수 있다.
  • binary 파일은 2진 코드로 구성되어 시스템이 바로 읽을 수 있기에 더 빠르게 실행 된다.
다음은 project을 binary 파일로 만들기 위한 Makefile 이다.
 SRCS = \
      __init__.py \
      a.py \
      project.py \
      b.py \
      cache.py
ifndef CFLAGS
TARGET = $(SRCS:%.py=%.pyc)
else
TARGET = $(SRCS:%.py=%.pyo)
endif
freeze:
    cxfreeze $(CFLAGS) project.py
  • binary 파일을 만들때 연동되는 모든 library 파일들 또한 하나의 binary file에 전부 포함 된다.
$ cxfreeze project.py
...
m encodings.uu_codec        /home/oneit/anaconda2/lib/python2.7/encodings/uu_codec.py
m encodings.zlib_codec      /home/oneit/anaconda2/lib/python2.7/encodings/zlib_codec.py
m errno                    
m exceptions               
m fcntl                     /home/oneit/anaconda2/lib/python2.7/lib-dynload/fcntl.so
m fnmatch                   /home/oneit/anaconda2/lib/python2.7/fnmatch.py
...
m multiprocessing.util      /home/oneit/anaconda2/lib/python2.7/multiprocessing/util.py
m ntpath                    /home/oneit/anaconda2/lib/python2.7/ntpath.py
m numbers                   /home/oneit/anaconda2/lib/python2.7/numbers.py
m opcode                    /home/oneit/anaconda2/lib/python2.7/opcode.py
m operator                  /home/oneit/anaconda2/lib/python2.7/lib-dynload/operator.so
...
m zipfile                   /home/oneit/anaconda2/lib/python2.7/zipfile.py
m zipimport                
m zlib                      /home/oneit/anaconda2/lib/python2.7/lib-dynload/zlib.so
Missing modules:
? Carbon imported from plistlib
? Carbon.File imported from plistlib
? Carbon.Files imported from plistlib
...
This is not necessarily a problem - the modules may not be needed on this platform.
copying /home/oneit/anaconda2/lib/python2.7/site-packages/Crypto/Cipher/_AES.so -> /home/oneit/_AES.so
copying /home/oneit/anaconda2/lib/python2.7/site-packages/Crypto/Cipher/../../../../libpython2.7.so.1.0 -> /home/oneit/project/src/dist/libpython2.7.so.1.0
$ file dist/project
project: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9ca6d38ee24250a0472a706b8bbe23d6614fe0ba, stripped
binary 파일을 어떻게 실행시킬까? 데몬화해서 실행시키게 된다.
daemon --pidfile="/var/run/project.pid" --user ngp "/usr/local/cdnet/project"

Trouble-shooting

import error
 yum or pip
Dependant libraries from pip or yum path when making a binary.

yum 설치 위치
/usr/lib64/python2.6/site-packages
pip 설치 위치
/usr/lib/python2.6/site-packages
해당 위치에 확인 해 보면 "backports"로 시작하는 패키지가 pip설치 위치에만 있어야 하고.
yum설치 위치에서는 깨끗하게 지워져야 합니다. (pycrypto 패키지도 비슷한이슈가 발생할 수 있습니다.)

댓글