Python

파이썬(python) 실행파일(exe) 만드는 방법 : PyInstaller 모듈 사용 방법

파이썬언어로 프로그램을 만들었다면 마지막 작업은 윈도우에서 아이콘을 클릭하여 실행할 수 있도록 실행파일을 만들어야 합니다. 실행파일의 확장자는 exe를 갖게됩니다. 제일 먼저 실행파일을 만들기 위해서는 pyinstaller를 설치해야합니다. 명령프롬프트 창을 열고 pip install pyinstaller를 타이핑 후 엔터키를 누르면 설치가 시작됩니다.

pip install pyinstaller

[실행결과]

Microsoft Windows [Version 10.0.19042.685]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\Users\ilike>pip install pyinstaller
Collecting pyinstaller
  Downloading pyinstaller-4.1.tar.gz (3.5 MB)
     |████████████████████████████████| 3.5 MB 6.4 MB/s
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Requirement already satisfied: setuptools in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from pyinstaller) (49.2.1)
Collecting altgraph
  Downloading altgraph-0.17-py2.py3-none-any.whl (21 kB)
Collecting pefile>=2017.8.1
  Downloading pefile-2019.4.18.tar.gz (62 kB)
     |████████████████████████████████| 62 kB 435 kB/s
Collecting future
  Downloading future-0.18.2.tar.gz (829 kB)
     |████████████████████████████████| 829 kB 6.4 MB/s
Collecting pyinstaller-hooks-contrib>=2020.6
  Downloading pyinstaller_hooks_contrib-2020.10-py2.py3-none-any.whl (166 kB)
     |████████████████████████████████| 166 kB 6.8 MB/s
Collecting pywin32-ctypes>=0.2.0
  Downloading pywin32_ctypes-0.2.0-py2.py3-none-any.whl (28 kB)
Using legacy 'setup.py install' for pefile, since package 'wheel' is not installed.
Using legacy 'setup.py install' for future, since package 'wheel' is not installed.
Building wheels for collected packages: pyinstaller
  Building wheel for pyinstaller (PEP 517) ... done
  Created wheel for pyinstaller: filename=pyinstaller-4.1-py3-none-any.whl size=2790249 sha256=75a3bcbbf9c6d567b31e7b8254af41d94a2912945f4d1f76a68e2b861236ae35
  Stored in directory: c:\users\ilike\appdata\local\pip\cache\wheels\30\0b\3c\7692e73baa6781c79b3945d2baabacc43889546a430324cd83
Successfully built pyinstaller
Installing collected packages: future, pywin32-ctypes, pyinstaller-hooks-contrib, pefile, altgraph, pyinstaller
    Running setup.py install for future ... done
    Running setup.py install for pefile ... done
Successfully installed altgraph-0.17 future-0.18.2 pefile-2019.4.18 pyinstaller-4.1 pyinstaller-hooks-contrib-2020.10 pywin32-ctypes-0.2.0

C:\Users\ilike>

이제 작업 준비는 끝났습니다. 명령프롬프트 창에서 pyinsstaller 명령어를 타이핑하여 실행파일을 만들어봅니다.

pyinstaller 명령어 뒤에 –onefile옵션을 주고 파이썬스크립트파일을 지정하였습니다.

–onefile옵션은 실행파일을 만들때 각종 리소스, 실행파일을 돌아가게 하기위해서 필요한 파일들이 있는데 이런것들을 모두 exe파일 하나로 묶어서 실행파일 하나만 생성되도록 하기위한 옵션입니다.

–onefile과 동일한 기능으로 -F도 대체하여 사용가능합니다.

–icon 옵션을 주면 실행파일의 아이콘이미지를 변경할 수 있습니다. 지원되는 이미지확장자는 ico입니다.

이미지를 ico로 컨버트(convert)해주는 웹사이트(icoconvert.com/)도 있으니 유용하게 사용하세요.

pyinstaller --onefile YearCalendar.py

기본 실행아이콘을 변경하고자 할 경우

pyinstaller --icon=myicon.ico --onefile YearCalendar.py

[exe파일이 만들어지는 과정의 LOG]

C:\python\Workspace>dir *.py
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 1C02-20EB

 C:\python\Workspace 디렉터리

2020-12-02  오후 03:10             1,971 calltest.py
2020-12-16  오후 06:26               115 main.py
2020-12-16  오후 06:26               109 YearCalendar.py
               3개 파일               2,195 바이트
               0개 디렉터리  24,049,852,416 바이트 남음
               
C:\python\Workspace>pyinstaller --onefile YearCalendar.py
126 INFO: PyInstaller: 4.1
126 INFO: Python: 3.9.0
129 INFO: Platform: Windows-10-10.0.19041-SP0
130 INFO: wrote C:\python\Workspace\YearCalendar.spec
134 INFO: UPX is not available.
144 INFO: Extending PYTHONPATH with paths
['C:\\python\\Workspace', 'C:\\python\\Workspace']
pygame 2.0.0 (SDL 2.0.12, python 3.9.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
745 INFO: checking Analysis
745 INFO: Building Analysis because Analysis-00.toc is non existent
746 INFO: Initializing module dependency graph...
750 INFO: Caching module graph hooks...
767 WARNING: Several hooks defined for module 'pygame'. Please take care they do not conflict.
785 INFO: Analyzing base_library.zip ...
4843 INFO: Processing pre-find module path hook distutils from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks\\pre_find_module_path\\hook-distutils.py'.
4845 INFO: distutils: retargeting to non-venv dir 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib'
9410 INFO: Caching module dependency graph...
9548 INFO: running Analysis Analysis-00.toc
9570 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by c:\users\ilike\appdata\local\programs\python\python39\python.exe
9850 WARNING: lib not found: api-ms-win-core-path-l1-1-0.dll dependency of c:\users\ilike\appdata\local\programs\python\python39\python39.dll
10362 INFO: Analyzing C:\python\Workspace\YearCalendar.py
10366 INFO: Processing module hooks...
10366 INFO: Loading module hook 'hook-difflib.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10369 INFO: Excluding import of doctest from module difflib
10370 INFO: Loading module hook 'hook-distutils.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10373 INFO: Loading module hook 'hook-distutils.util.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10377 INFO: Excluding import of lib2to3.refactor from module distutils.util
10377 INFO: Loading module hook 'hook-encodings.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10496 INFO: Loading module hook 'hook-heapq.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10499 INFO: Excluding import of doctest from module heapq
10500 INFO: Loading module hook 'hook-lib2to3.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10582 INFO: Loading module hook 'hook-multiprocessing.util.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10585 INFO: Excluding import of test.support from module multiprocessing.util
10585 INFO: Excluding import of test from module multiprocessing.util
10586 INFO: Loading module hook 'hook-pickle.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10589 INFO: Excluding import of argparse from module pickle
10589 INFO: Loading module hook 'hook-sysconfig.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10591 INFO: Loading module hook 'hook-xml.etree.cElementTree.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10593 INFO: Loading module hook 'hook-xml.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
10708 INFO: Loading module hook 'hook-_tkinter.py' from 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks'...
11051 INFO: checking Tree
11052 INFO: Building Tree because Tree-00.toc is non existent
11054 INFO: Building Tree Tree-00.toc
11217 INFO: checking Tree
11217 INFO: Building Tree because Tree-01.toc is non existent
11219 INFO: Building Tree Tree-01.toc
11365 INFO: checking Tree
11366 INFO: Building Tree because Tree-02.toc is non existent
11367 INFO: Building Tree Tree-02.toc
11399 INFO: Looking for ctypes DLLs
11426 INFO: Analyzing run-time hooks ...
11430 INFO: Including run-time hook 'c:\\users\\ilike\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py'
11438 INFO: Looking for dynamic libraries
11647 INFO: Looking for eggs
11648 INFO: Using Python library c:\users\ilike\appdata\local\programs\python\python39\python39.dll
11650 INFO: Found binding redirects:
[]
11654 INFO: Warnings written to C:\python\Workspace\build\YearCalendar\warn-YearCalendar.txt
11699 INFO: Graph cross-reference written to C:\python\Workspace\build\YearCalendar\xref-YearCalendar.html
11725 INFO: checking PYZ
11725 INFO: Building PYZ because PYZ-00.toc is non existent
11726 INFO: Building PYZ (ZlibArchive) C:\python\Workspace\build\YearCalendar\PYZ-00.pyz
12243 INFO: Building PYZ (ZlibArchive) C:\python\Workspace\build\YearCalendar\PYZ-00.pyz completed successfully.
12261 INFO: checking PKG
12262 INFO: Building PKG because PKG-00.toc is non existent
12263 INFO: Building PKG (CArchive) PKG-00.pkg
15571 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
15575 INFO: Bootloader c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
15577 INFO: checking EXE
15578 INFO: Building EXE because EXE-00.toc is non existent
15579 INFO: Building EXE from EXE-00.toc
15580 INFO: Appending archive to EXE C:\python\Workspace\dist\YearCalendar.exe
15598 INFO: Building EXE from EXE-00.toc completed successfully.

C:\python\Workspace>

정상적으로 실행파일이 만들어졌다면 마지막 줄에 파일이 생성된 경로와 함께 실행파일 정보를 알려줍니다. dist라는 폴더를 생성해서 그 안에 exe파일을 생성하네요.

C:\python\Workspace\dist\YearCalendar.exe

completed successfully.

생성된 실행파일을 실행해봅니다.

C:\python\Workspace>cd dist

C:\python\Workspace\dist>
C:\python\Workspace\dist>dir/w
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 1C02-20EB

 C:\python\Workspace\dist 디렉터리

[.]                [..]               YearCalendar.exe
               1개 파일           7,716,495 바이트
               2개 디렉터리  24,021,151,744 바이트 남음

C:\python\Workspace\dist>YearCalendar
년도를 입력하세요(숫자만):2021
                                  2021

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7       1  2  3  4  5  6  7
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
25 26 27 28 29 30 31                                29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4                      1  2          1  2  3  4  5  6
 5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                          31

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4                         1             1  2  3  4  5
 5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                          30 31

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7             1  2  3  4  5
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
25 26 27 28 29 30 31      29 30                     27 28 29 30 31


C:\python\Workspace\dist>

파이썬으로 PyQt5를 사용하여 GUI 개발을 하여 실행파일을 만들경우 –noconsole 옵션을 주면 프로그램이 실행될때 콘솔창(명령프롬프트)이 뜨지 않고 실행됩니다.  같은 방법으로 -w 또는 –windowed 옵션으로 대체가능합니다.

[REFERENCE]

PyQt5 Tutorial – 파이썬으로 만드는 나만의 GUI 프로그램

Leave a Reply

error: Content is protected !!