티스토리 뷰

파이썬

파이썬 exe 만들기, pyinstaller python

헬로르르 2018. 5. 22. 18:23

python 으로 좀 큰 프로젝트를 하시는 분들은 쉽게쉽게 exe 파일이 생성이 안되는걸 종종 경험 하셨을 겁니다. 제가 사용하는 방법은 pyinstaller 를 사용해서 여러 패키지가 포함된 프로젝트를 exe 빌드 하는 법을 설명 드리겠습니다.


(이 글을 보신분들은 기본적으로 pyinstaller 를 한번이라도 써보신 분들 대상입니다)


가장 기본적으로 컴파일 하는 방법은

    1. .spec 파일 작성 ( pyinstaller build 스크립트 )

    2. pyinstaller blahblah.spec

입니다.


우선 아래 코드는 제가 실제로 사용하는 pyinstaller 인스톨 용 스크립트 파일입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# -*- mode: python -*-
 
# if you use pyqt5, this patch must be adjusted
# https://github.com/bjones1/pyinstaller/tree/pyqt5_fix
 
block_cipher = None
 
 
= Analysis(['run.py'],
             pathex=['C:\\Users\\seoung\\workspace\\pytool'],
             binaries=[],
             datas=[('./config','./config'),
                    ('./gui/*.ui','./gui'),
                    ('./script','./script')],
             hiddenimports=["feature.testmanager",
                            "feature.command",
                            "feature.consolemanager",
                            "feature.dummymanager",
                            "feature.testmanager",
                            "interface.can.can",
                            "interface.lan.lan",
                            "interface.serial.serial",
                            
                            "gui.commandwindows",
                            "gui.consolewindows",
                            "gui.controlwindows",
                            "gui.imageview",
                            "gui.mainwindows",
                            "gui.testview",                            
                            "gui.scriptwindows",                            
                            "gui.codeeditor",
                            "gui.syntax",
                            
                            ],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='run',
          debug=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='run')
 
cs


a = Analysis(['run.py'],

에는 실제 메인 실행 파일을 넣어주시면 됩니다.

실제 제가 만들어놓은 프로젝트는 run.py 을 main 함수로 이용하고 각 feature / gui / interface 패키지를 보유하고 있습니다. (대략적인 구조는 아래와 같습니다)


workspace

    run.py

    run.spec (build script)

        - feature (package)

             command.py

             consolmanager.py

             testmanager.py

             dummymanager.py

        - gui (package)

             commandwindows.py

             consolewindows.py

             mainwindows.py

             scriptwindows.py

             *.ui (pyqt 디자인 파일)

        - interface (package)

            - can

                can.py

            - lan

                lan.py

            - serial

                serial.py



그리고 hiddenimports = [...] 에는 개발자가 만든 패키지 및 import 되어 있는 라이브러리 들을 포함시켜 주시면 됩니다. (예를들면 import paramiko 를 사용시, paramiko 도 추가시켜야 합니다.)


hiddenimports 를 추가하지 않으면, 오직 run.py 에서만 import 되어있는 패키지만 사용하게 되더라고요. 만약 사용하는 모든 패키지를 run.py 에서 선언하면 될거 같긴 한데 해보진 않았습니다.



그리고 data = [..., ...] 은 실제 프로그램 동작 시 필요한 파일 들 입니다. 위의 소스트리 에서 포함되어있는 gui패키지 밑에 *.ui (qt디자인)을 예시로 들겠습니다.


만약 exe를 빌드하고 해당 ui 파일이 없다면 실행이 안되겠죠? 이러한 이유로 빌드를 할 때 필요한 파일들도 spec에 추가 시켜 주셔야 합니다.


제 예시처럼 (복사할 폴더, 목표폴더) 를 적어주시면 빌드 할 때 copy 를 수행하게 됩니다.



간단하게 포스팅을 마칠게요. 마지막으로 해드릴 말은 실제로 exe 빌드 후 파이썬이 설치되어있지 않은 환경에서 꼭 실행시켜 보시길 바랍니다. import 되어있지 않는 라이브러리들이 보통 존재 하니 이것들을 꼭 찾아서 포함시켜주셔야 합니다!



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함