파이썬(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 프로그램