CHIqueen
파이썬 코드(2.7)를 exe로 만들어 보자! 본문
python 2버전에서 .py를 .exe로 바꿔보고 .exe를 .pyc로 .pyc를 .py로 바꿔보는 삽질을 정리해 보겠습니다.
먼저 pyinstaller는 빠른 손절이 필요합니다. python 2버전을 지원하지 않습니다. python 3버전으로 pyintaller를 설치해 2버전 소스코드를 exe로 만들 수는 있지만 pip로 따로 설치한 라이브러리는 포함되지 않습니다. 설령 성공했다해도 버전 오류가 펑펑 터질 겁니다.
블로그 보면서 pyinstaller를 2버전에서 성공한것을 보고 버전을 낮춰보면서 설치해보고 돌려봤지만 그놈의 builtins때문에 절대 설치를 못합니다 pyintaller를 돌리려면 코드를 3버전 기준으로 작성해 주세요
우리는 py2exe를 사용할겁니다.
pip install py2exe
먼저 make.py를 만들어 줍니다.
from distutils.core import setup
import py2exe
setup(console = ["exe로 만들 코드.py"])
그 다음 저는 그냥 python make.py하면 끝인줄 알았는데 python make.py py2exe를 해야 exe가 만들어 집니다.
build랑 dist폴더가 만들어지는데 dist폴더에 프로그램이 생성됩니다.
하지만 코드에있던 라이브러리들이 .pyd로 만들어져 같이 나오고 파이썬의 기본 라이브러리(ex sys, os 등등등)들이 압축된 형태로 나옵니다.
만약 exe 하나만 원한다면 아래와 같은 코드를 작성하고 실행하면 됩니다.
from distutils.core import setup
import py2exe
excludes = [
"pywin",
"pywin.debugger",
"pywin.debugger.dbgcon",
"pywin.dialogs",
"pywin.dialogs.list",
"win32com.server",
]
options = {
"bundle_files": 1, # 단일 파일 생성
"compressed" : 1,
"excludes" : excludes,
"dll_excludes": ["w9xpopen.exe"]
}
setup(
options = {"py2exe": options},
zipfile = None,
console = ["exe로 만들 코드.py"]
)
이러면 exe하나만 나오게 할 수 있습니다.
하지만 나중에 exe를 pyc로 만들때 marshal에러가 발생하기 때문에 해킹대회 문제를 만들때는 하나로 만들지 않도록 합니다.
이제 exe를 pyc로 바꿔 봅시다.
제가 exe를 pyc로 바꾸려고 Unpy2exe랑 repy2exe등 별의 별거를 다 사용해 봤지만 진짜 builtins때문에 다 먹통입니다. 짜증나서 샷건 치려던 순간 갓 구글의 코드를 만나고 살았습니다.
https://code.google.com/archive/p/py2exe-extract/downloads
다행히 2버전에서 돌아가는 코드라 python py2exe_extract.py 이름.exe를 통해 pyc를 얻을 수 있습니다.
pyc는 py를 컴파일한 파일 대략적으로 읽을 수 있긴 하지만 완전히 읽을 수 는 없습니다.
우리는 uncompyle6를 통해 pyc를 py로 바꿔 보겠습니다.
pip install uncompyle6
uncompyle6 -d 이름.pyc 하면 깨끗하게 우리의 소스코드가 나옵니다.