코드 프리징하기

../_images/33907151034_e0a9e53402_k_d.jpg

코드를 “프리징(freezing)”한다는 것은 최종 사용자에게 배포할, 응용의 모든 코드와 파이썬 인터프리터를 포함한 단일 파일 실행 파일을 만드는 것입니다.

‘Dropbox’, ‘Eve Online’, ‘Civilization IV’, BitTorrent 클라이언트 같은 응용이 이렇게 합니다.

이런 식으로 배포하는 장점은 사용자가 필요한 파이썬 버전(또는 어떤 파이썬도)을 이미 설치하지 않았더라도 응용이 “그냥 동작한다”는 점입니다. Windows에서, 그리고 많은 리눅스 배포판과 OS X에서도, 알맞은 버전의 파이썬이 이미 설치되어 있지 않을 것입니다.

게다가 최종 사용자용 소프트웨어는 항상 실행 가능한 포맷이어야 합니다. .py 로 끝나는 파일은 소프트웨어 엔지니어와 시스템 관리자를 위한 것입니다.

프리징의 한 가지 단점은 배포본의 크기가 약 2–12 MB 늘어난다는 점입니다. 또한 파이썬의 보안 취약점이 패치되면 그에 맞춰 응용의 갱신된 버전을 배포해야 하는 책임도 지게 됩니다.

프리징의 대안

코드 패키징 은 라이브러리나 도구를 다른 개발자에게 배포하기 위한 것입니다.

리눅스에서는 프리징의 대안으로 리눅스 배포판 패키지를 만드는 것 (예: Debian이나 Ubuntu용 .deb 파일, Red Hat과 SuSE용 .rpm 파일)이 있습니다.

할 일

“코드 프리징하기” 스텁 채우기

프리징 도구 비교

작성일: 2019년 10월 5일. 솔루션과 지원되는 플랫폼/기능:

솔루션

Windows

Linux

OS X

Python 3

라이선스

단일 파일 모드

Zipfile 임포트

Egg

pkg_resources 지원

최신 릴리즈 일자

bbFreeze

아니오

MIT

아니오

2014년 1월 20일

py2exe

아니오

아니오

MIT

아니오

아니오

2014년 10월 21일

pyInstaller

GPL

아니오

아니오

2019년 7월 9일

cx_Freeze

PSF

아니오

아니오

2019년 8월 29일

py2app

아니오

아니오

MIT

아니오

2019년 3월 25일

참고

리눅스에서 파이썬 코드를 Windows 실행 파일로 프리징하는 기능은 PyInstaller에서 한때만 지원되었고 이후 지원이 중단되었습니다.

참고

py2app을 제외한 모든 솔루션은 대상 머신에 Microsoft Visual C++가 설치되어 있어야 합니다. Configure.py--onefile 을 전달했을 때 적절한 DLL을 함께 묶어 자가 실행 가능한 exe를 만드는 것은 PyInstaller뿐입니다.

Windows

bbFreeze

사전 요구사항은 Windows에 Python, Setuptools, pywin32 의존성을 설치 하는 것입니다.

  1. bbfreeze 설치:

$ pip install bbfreeze
  1. 가장 기본적인 bb_setup.py 작성

from bbfreeze import Freezer

freezer = Freezer(distdir='dist')
freezer.addScript('foobar.py', gui_only=True)
freezer()

참고

이것은 가장 기본적인 단일 파일 스크립트에 대해 동작합니다. 더 고급 프리징을 위해서는 다음과 같이 include 및 exclude 경로를 제공해야 합니다:

freezer = Freezer(distdir='dist', includes=['my_code'], excludes=['docs'])
  1. (선택) 아이콘 포함

freezer.setIcon('my_awesome_icon.ico')

4. Provide the Microsoft Visual C++ runtime DLL for the freezer. It might be possible to append your sys.path with the Microsoft Visual Studio path but I find it easier to drop msvcp90.dll in the same folder where your script resides.

  1. 프리징!

$ python bb_setup.py

py2exe

사전 요구사항은 Windows에 Python 설치 입니다. py2exe의 마지막 릴리즈는 2014년입니다. 활발한 개발은 이루어지고 있지 않습니다.

  1. http://sourceforge.net/projects/py2exe/files/py2exe/ 에서 다운로드하여 설치합니다.

  2. setup.py 작성 (설정 옵션 목록):

from distutils.core import setup
import py2exe

setup(
    windows=[{'script': 'foobar.py'}],
)
  1. (선택) 아이콘 포함

  2. (선택) 단일 파일 모드

  3. dist 디렉토리에 .exe 생성:

$ python setup.py py2exe
  1. Microsoft Visual C++ 런타임 DLL을 제공합니다. 두 가지 선택지: 대상 머신에 dll을 전역적으로 설치 하거나 dll을 .exe와 함께 배포 합니다.

PyInstaller

사전 요구사항은 Windows에 Python, Setuptools, pywin32 의존성이 설치 되어 있는 것입니다.

OS X

py2app

PyInstaller

PyInstaller는 Mac OS X 10.6 (Snow Leopard) 이상에서 Unix 실행 파일과 윈도우 앱을 빌드하는 데 사용할 수 있습니다.

PyInstaller를 설치하려면 pip을 사용하세요:

$ pip install pyinstaller

예를 들어 script.py 로부터 표준 Unix 실행 파일을 만들려면 다음을 사용하세요:

$ pyinstaller script.py

이것은 다음을 생성합니다:

  • make 파일에 해당하는 script.spec 파일

  • 일부 로그 파일을 담는 build 폴더

  • 메인 실행 파일 script 와 일부 의존하는 파이썬 라이브러리를 담는 dist 폴더

이 모두가 script.py 와 같은 폴더에 생깁니다. PyInstaller는 script.py 에서 사용된 모든 파이썬 라이브러리를 dist 폴더에 넣으므로, 실행 파일을 배포할 때는 dist 폴더 전체를 배포하세요.

script.spec 파일을 편집하여 빌드를 사용자 정의 할 수 있으며, 다음과 같은 옵션이 있습니다:

  • 실행 파일과 함께 데이터 파일 묶기

  • PyInstaller가 자동으로 추론할 수 없는 런타임 라이브러리(.dll 또는 .so 파일) 포함하기

  • 실행 파일에 파이썬 런타임 옵션 추가하기

이제 (script.py 를 다시 사용하는 대신) pyinstallerscript.spec 을 실행할 수 있습니다:

$ pyinstaller script.spec

독립 실행 가능한 윈도우드 OS X 응용을 만들려면 --windowed 옵션을 사용하세요:

$ pyinstaller --windowed script.spec

이것은 dist 폴더에 script.app 을 생성합니다. 앱의 그래픽 부분을 제어하려면 파이썬 코드에서 PyQtPySide 같은 GUI 패키지를 사용해야 합니다.

script.spec 에는 Mac OS X 앱 번들과 관련된 옵션이 여럿 여기 에 있습니다. 예를 들어 앱의 아이콘을 지정하려면 icon=pathtoicon.icns 옵션을 사용하세요.

Linux

bbFreeze

경고

bbFreeze는 이전 유지보수자가 밝힌 대로 더 이상 유지보수되지 않기 때문에, 파이썬 2.x 환경에서만 동작합니다. 관심이 있다면 여기 에서 저장소를 확인하세요.

bbFreeze는 pip2 및/또는 easy_install과 함께 파이썬이 설치된 모든 배포판에서 사용할 수 있습니다.

pip2의 경우 다음을 사용하세요:

$ pip2 install bbfreeze

또는 easy_install의 경우:

$ easy_install bbfreeze

bbFreeze가 설치되면 응용을 프리징할 준비가 된 것입니다.

예를 들어 “hello.py” 라는 스크립트와 “module.py” 라는 모듈이 있고, 그 모듈에 스크립트에서 사용되는 함수가 있다고 합시다. 걱정하지 마세요. 스크립트의 메인 엔트리포인트만 프리징하도록 요청해도 전체가 프리징됩니다:

$ bbfreeze script.py

이것은 dist/ 라는 폴더를 생성하며, 그 안에는 스크립트의 실행 파일과 파이썬 스크립트에서 사용된 라이브러리에 링크된 필요한 .so(공유 객체) 파일이 들어 있습니다.

또는 프리징을 대신 수행하는 스크립트를 만들 수도 있습니다. 라이브러리 안에서 프리저용 API를 사용할 수 있습니다:

from bbfreeze import Freezer

freezer = Freezer(distdir='dist')
freezer.addScript('script.py', gui_only=True) # Enable gui_only kwarg for app that uses GUI packages.
freezer()

PyInstaller

PyInstaller는 OS X에서와 유사한 방식으로 사용할 수 있습니다. 설치는 OS X 섹션에서 보인 것과 같은 방식으로 진행됩니다.

사용을 위해 Python과 pip 같은 의존성을 설치하는 것을 잊지 마세요.