ํ์ด์ฌ ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์
์ปดํ์ผํ๊ธฐ
PySide6์ PyInstaller ์ฌ์ฉ๋ฒ
ํ์ด์ฌ์ผ๋ก ์ฝ๋ฉํ ํ ์ด๋ฅผ ๊ฐํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด ์ฝ์์ ํตํด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ํธ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค์ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ ์ด๋ณด์์๊ฒ ๋ฒ ์ฐจ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , PySide6๋ฅผ ์ฌ์ฉํ๋ฉด Qt ํ๋ ์์ํฌ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ด์ฌ์์ ์ฌ์ฉํ ์ ์์ด, ์น ๊ธฐ์ ๊ณผ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋ง์น ํ, ๋ฐฐํฌ ๋จ๊ณ์์ PyInstaller๋ก ํจํค์งํ ์คํ ํ์ผ์ด ์ ๋๋ก ์๋ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ํนํ QtWebEngine์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ฌธ์ ๋ค์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค:
PyInstaller-PySide6-์ปดํ์ผ-๊ณผ์ -๋ฌธ์ -ํด๊ฒฐ๋ฐฉ๋ฒ
- QtWebEngine ๊ด๋ จ ํ์ผ ๋๋ฝ
- ๋ฆฌ์์ค ํ์ผ ๋ถ์ฌ
- ๋ฐํ์ ์์กด์ฑ ๋ฌธ์
์ด ๊ธ์์๋ PyInstaller๋ฅผ ํ์ฉํ PySide6 ์น๋ทฐ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํ์ผ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
1. ํ์ ์ค๋น๋ฌผ
์ ํ๋ฆฌ์ผ์ด์ ์ ํจํค์งํ๊ธฐ ์ ์ ํ์ํ ์ค๋น๋ฌผ์ ์ค์นํด์ผ ํฉ๋๋ค:
- Python 3.7 ์ด์: ์ต์ ๋ฒ์ ์ ํ์ด์ฌ์ ์ค์นํด์ผ ํฉ๋๋ค.
- PySide6:
pip install pyside6
๋ช ๋ น์ด๋ก PySide6๋ฅผ ์ค์นํฉ๋๋ค. - PyInstaller:
pip install pyinstaller
๋ช ๋ น์ด๋ก PyInstaller๋ฅผ ์ค์นํฉ๋๋ค. - 10GB ์ด์์ ์ฌ์ ๋์คํฌ ๊ณต๊ฐ: ํจํค์ง ๊ณผ์ ์์ ๋ง์ ํ์ผ์ด ์์ฑ๋๋ฏ๋ก, ์ถฉ๋ถํ ๋์คํฌ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค.
์ด ์ค๋น๋ฌผ์ ๋ชจ๋ ๊ฐ์ถ ํ, ๋ณธ๊ฒฉ์ ์ธ ์ปดํ์ผ ์์ ์ ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
2. ๊ธฐ๋ณธ ์ปดํ์ผ ๋ช ๋ น์ด (์คํจํ๋ ๊ฒฝ์ฐ)
PyInstaller๋ฅผ ์ฌ์ฉํ์ฌ PySide6 ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
pyinstaller --onefile --noconsole ex.py
ํ์ง๋ง ์ด ๋ช ๋ น์ด๋ ์ข ์ข ์คํจํ ์ ์์ต๋๋ค. ์คํจํ๋ ์ฃผ๋ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- QtWebEngineProcess.exe ๋๋ฝ: QtWebEngine ๊ด๋ จ ์น ์ฝํ ์ธ ๋ ๋๋ง์ด ๋ถ๊ฐํด์ง๋ฉฐ, ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ์๋ํ์ง ์๊ฒ ๋ง๋ญ๋๋ค.
- ๋ฆฌ์์ค ํ์ผ ๋ถ์ฌ: ์์ด์ฝ, ํฐํธ ๋ฑ์ UI ๋ฆฌ์์ค๊ฐ ๋น ์ง๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ถ์์ ํ๊ฒ ์คํ๋ฉ๋๋ค.
- ๋ฐํ์ ์์กด์ฑ ๋ฌธ์ : Qt ํ๋ฌ๊ทธ์ธ ๋ก๋ ์คํจ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์๋์์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
์คํจ ์์ธ ๋ถ์
- QtWebEngineProcess.exe ๋๋ฝ: ์น ์ฝํ ์ธ ๋ ๋๋ง ๋ถ๊ฐ
- ๋ฆฌ์์ค ํ์ผ ๋ถ์ฌ: ์์ด์ฝ, ํฐํธ ๋ฑ UI ๋ฆฌ์์ค ์์
- ๋ฐํ์ ์์กด์ฑ ๋ฌธ์ : Qt ํ๋ฌ๊ทธ์ธ ๋ก๋ ์คํจ
3. ์๋ฒฝํ ์ปดํ์ผ ํ๊ธฐ
PyInstaller๋ฅผ ์ฌ์ฉํ ๋ QtWebEngine ๊ด๋ จ ํ์ผ์ ๋ช ์์ ์ผ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋คใ
3.1. ์๋ ๋ช ๋ น์ด ๋ฐฉ์ (Windows)
pyinstaller --onefile --noconsole ^
--add-data "C:\path\to\Python\Lib\site-packages\PySide6\Qt\bin\QtWebEngineProcess.exe;QtWebEngineProcess" ^
--add-data "C:\path\to\Python\Lib\site-packages\PySide6\Qt\resources;Qt\resources" ^
--add-data "C:\path\to\Python\Lib\site-packages\PySide6\Qt\translations;Qt\translations" ^
ex.py
PyInstaller๋ฅผ ์ฌ์ฉํ ๋ QtWebEngine ๊ด๋ จ ํ์ผ์ ๋ช ์์ ์ผ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค.
3.2. ์๋ํ ์คํฌ๋ฆฝํธ ๋ฐฉ์ (์ถ์ฒ)
์์ ๊ฐ์ ์๋ ๋ฐฉ์์ด ๋ฒ๊ฑฐ๋กญ๋ค๋ฉด, ์๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ฌ ์ปดํ์ผ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋๋ ์ด๋ฅผ ์ํ ์๋ํ ์คํฌ๋ฆฝํธ build.py์ ์์์ ๋๋ค. 'ex.py'๋ PyInstaller๋ก ํจํค์งํ ํ์ด์ฌ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ด๋ฆ์ ๋๋ค. ๊ธฐํ ์ค์ ์ ์๋์ผ๋ก ์ค์น ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ง๋ง, ๊ฐํน ์ค์น ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์์ ํด์ผ ํ ๋ถ๋ถ์ ์ฌ๊ธฐ์, ์ค์ ๋น๋ํ๋ ค๋ Python ํ์ผ์ ์ด๋ฆ์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ ์ด๋ฆ์ด main.py๋ก ๋ค๋ฅด๋ค๋ฉด 'main.py'๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ ํ์ผ ์ด๋ฆ ์ ๋๋ง ๋ณ๊ฒฝํด์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
import os
import site
from PyInstaller.__main__ import run
# PySide6 ์ค์น ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค.
pyside6_dir = site.getsitepackages()[0] + "\\PySide6"
opts = [
'ex.py', # ๋น๋ํ ํ์ด์ฌ ์คํฌ๋ฆฝํธ ํ์ผ
'--onefile', # ํ๋์ ์คํ ํ์ผ๋ก ๋ง๋ญ๋๋ค.
'--noconsole', # ์ฝ์ ์ฐฝ์ ํ์ํ์ง ์๋๋ก ์ค์ ํฉ๋๋ค.
'--add-data', f'{pyside6_dir}\\Qt\\bin\\QtWebEngineProcess.exe;QtWebEngineProcess',
'--add-data', f'{pyside6_dir}\\Qt\\resources;Qt\\resources',
'--add-data', f'{pyside6_dir}\\Qt\\translations;Qt\\translations',
'--name', 'MyWebViewApp' # ์์ฑํ ์คํ ํ์ผ์ ์ด๋ฆ ์ค์
]
# PyInstaller ์คํ
run(opts)
์ด๋ ๊ฒ ํ๋ฉด PyInstaller ๋ช ๋ น์ด๋ฅผ ๋งค๋ฒ ์ ๋ ฅํ๋ ๋ฒ๊ฑฐ๋ก์ ์์ด ์๋์ผ๋ก ์ปดํ์ผ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
python build.py
4. ์ปดํ์ผ ํ ๊ฒ์ฆ ๋ฐฉ๋ฒ
- ํ์ผ ๊ตฌ์กฐ ๊ฒ์ฌ: QtWebEngineProcess ๋ฐ ๋ฆฌ์์ค ํด๋ ํ์ธ
- ์คํ ํ ์คํธ: ๊ด๋ฆฌ์ ๊ถํ ์์ด ์ผ๋ฐ ๋ชจ๋๋ก ์คํ
- ๋๋ฒ๊น : ์ฝ์ ๋ก๊ทธ ํ์ธ (--noconsole ์ต์ ์ ๊ฑฐ ํ)
5. ๋ฐฐํฌ ๋ฐฉ๋ฒ
- ์ธ์คํจ๋ฌ ํจํค์ง: Inno Setup ๋๋ NSIS ์ฌ์ฉ
- ์ฝ๋ ์๋ช : Windows ์ค๋งํธ์คํฌ๋ฆฐ ๊ฒฝ๊ณ ๋ฐฉ์ง
- ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ: ์๋ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ ๊ตฌํ
6. ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
Q1. 'QtWebEngineProcess not found' ์ค๋ฅ ํด๊ฒฐ๋ฒ
PySide6 ์ค์น ๊ฒฝ๋ก๋ฅผ ์ ํํ ํ์ธํ์ธ์. ๊ฐ์ ํ๊ฒฝ ์ฌ์ฉ ์ ๋ค์ ๋ช ๋ น์ด๋ก ์์น ํ์ธ:
python -c "import PySide6; print(PySide6.__file__)"
Q2. exe ์คํ ์ ํฐ ํ๋ฉด ๋ฌธ์
QtWebEngineProcess.exe์ ๋ฆฌ์์ค ํ์ผ์ด ์ ๋๋ก ํฌํจ๋์๋์ง ํ์ธ
Q3. ํ์ผ ํฌ๊ธฐ ์ค์ด๋ ๋ฐฉ๋ฒ
UPX ์์ถ ๋๊ตฌ ์ฌ์ฉ: --upx-dir
์ต์
์ถ๊ฐ
7. ๋ฐฐํฌ๋ฅผ ์ํ ์ฒดํฌํฌ์ธํธ
- ๋ชจ๋ ๋ฆฌ์์ค ํ์ผ ํฌํจ ํ์ธ
- ๋ค์ํ Windows ๋ฒ์ (10, 11)์์ ํ ์คํธ
- ๋ฐ์ด๋ฌ์ค ๊ฒ์ฌ ์ํ
- ์ฌ์ฉ์ ๋งค๋ด์ผ ์์ฑ