๐ ํ์ด์ฌ ์คํ ํ์ผ(EXE) ๋น๋, ์ ์ด๋ ๊ฒ ํฌ๊ณ ์ค๋ ๊ฑธ๋ฆด๊น? (ํนํย --onefile
ย ์ต์
์ ๋น๋ฐ) ๋ง์คํฐ ์ฒญ์ฌ์ง
๐ก ์ํฉ ํด๋
- ํ์ฌ ์ํ: ๋ด๊ฐ ์ด์ฌํ ๋ง๋ ํ์ด์ฌ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ์ฌ๋๋ ์ฝ๊ฒ ์ธ ์ ์๊ฒ ์คํ ํ์ผ(๋ณดํตย
.exe
)๋ก ๋ง๋ค๋ ค๊ณ ํ๋๋ฐ, ๋ง์ ๋ง๋ค์ด๋ณด๋ ํ์ผ ํฌ๊ธฐ๊ฐ ์์ฒญ๋๊ฒ ํฌ๊ณ , ๋ง๋๋ ๋ฐ ์๊ฐ๋ ๋๋ฌด ์ค๋ ๊ฑธ๋ ค์ ์ ํฐ์ง๋ ์ํฉ์ด์์. "๋ด ์ฝ๋๋ ๋ช ์ค ์ ๋๋๋ฐ ์ ์ด๋ฌ์ง?" ์ถ์ฃ . - ํต์ฌ ์์ :
- ๋ง๋ค์ด์ง ์คํ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์์๋ณด๋ค ํจ์ฌ ํฌ๋ค. (์์ญ MB๋ ๊ธฐ๋ณธ, ์๋ฐฑ MB๋ฅผ ๋์ด GB ๋จ์๊น์ง!)
- ์คํ ํ์ผ์ ๋ง๋๋ ๊ณผ์ (๋น๋)์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฐ๋ค. (์ปคํผ ํ ์์ ์ฐ์ต๊ณ , ์ ์ฌ ๋จน๊ณ ์์ผ ํ ํ)
- ํนํ "ํ์ผ ํ๋๋ก ๊น๋ํ๊ฒ ๋ง๋ค์ด์ค!" (
--onefile
ย ์ต์ )๋ฅผ ์ ํํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํจ์ฌ ์ฌ๊ฐํด์ง๋ค. - ์์ vs ํ์ค:
- ์์: "๋ด ํ์ด์ฌ ์ฝ๋๋ ๊ฐ๋จํ๋๊น, ์คํ ํ์ผ๋ ์๊ณ ๊ธ๋ฐฉ ๋๋ฑ ๋ง๋ค์ด์ง๊ฒ ์ง?"
- ํ์ค: "์๋, ์ฝ๋๋ 100์ค๋ ์ ๋๋๋ฐ ์คํ ํ์ผ์ ๋ง 500MB๊ฐ ๋๊ณ , ๋น๋ํ๋ ๋ฐ 10๋ถ, 20๋ถ์ด ๊ทธ๋ฅ ์ง๋๊ฐ๋ค? ์ฌ์ง์ดย
--onedir
(ํด๋์งธ๋ก ๋ง๋ค๊ธฐ) ์ต์ ์ผ๋ก ํ๋ฉด 100MB๋ ์ ๋๋๋ฐ, ์ย--onefile
(ํ๋๋ก ํฉ์น๊ธฐ)๋ง ์ฐ๋ฉด ์ด๋ ๊ฒ ๊ดด๋ฌผ์ด ๋๋ ๊ฑฐ์ผ?" - ์ํฅ ๋ฒ์:
- ๊ฐ๋ฐ ์๋ ์ ํ: ๋น๋ ํ ๋ฒ ํ๋ ค๋ฉด ํ์ธ์์ด๋, ์ฝ๋ ์์ ํ๊ณ ํ ์คํธํ๋ ๊ณผ์ ์ด ๋๋ฌด ๋๋ ค์ ธ์.
- ๋ฐฐํฌ์ ์ด๋ ค์: ํ์ผ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ์ด๋ฉ์ผ๋ก ๋ณด๋ด๊ธฐ๋, ์น์ ์ฌ๋ฆฌ๊ธฐ๋ ๋ถ๋ด์ค๋ฝ์ฃ .
- ์ฌ์ฉ์ ๋ถ๋ง: ํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๋ ์ฌ์ฉ์๋ ํฐ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ค์น(์์ถ ํด์ )ํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์ง์ฆ์ด ๋์.
- ์์ ๊ฐ ํ๋ฝ: "๋ด๊ฐ ๋ญ ์๋ชปํ๋?" ์์ฑ ํ๊ฒ ๋๊ณ , ํ์ด์ฌ์ผ๋ก ํ๋ก๊ทธ๋จ ๋ง๋๋ ๊ฒ ๊ดํ ์ด๋ ต๊ฒ ๋๊ปด์ ธ์.
๐ ์์ธ ํฌ์
- ๊ทผ๋ณธ ์์ธ: ์คํ ํ์ผ์ ์ฐ๋ฆฌ๊ฐ ์ง ํ์ด์ฌ ์ฝ๋๋ง ๋๋ ๋ณต์ฌํด ๋์ ๊ฒ ์๋์์. ๊ทธ ์ฝ๋๊ฐ ์ค์ ๋ก ์ปดํจํฐ์์ ๋์๊ฐ๋ ค๋ฉด, **ํ์ด์ฌ ์ธ์ด๋ฅผ ํด์ํด ์ค ๋ฒ์ญ๊ฐ(ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ), ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ชจ๋ ์ธ๋ถ ๋๊ตฌ๋ค(๋ผ์ด๋ธ๋ฌ๋ฆฌ), ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ํฌ์ฅ ๊ธฐ์ (PyInstaller ๊ฐ์ ๋๊ตฌ์ ์๋ ๋ฐฉ์)**๊น์ง ์ ๋ถ ํ์ํ๊ฑฐ๋ ์.ย
--onefile
ย ์ต์ ์ ์ด ๋ชจ๋ '์ด์ฟ์ง'์ ํ๋์ ๊ฑฐ๋ํ ๊ฐ๋ฐฉ์ ์ต์ง๋ก ๊ตฌ๊ฒจ ๋ฃ๋ ๊ฒ๊ณผ ๊ฐ์์. - ์ฐ๊ฒฐ ๊ณ ๋ฆฌ:
- ์ฐ๋ฆฌ๊ฐ ์ง ํ์ด์ฌ ์ฝ๋(
.py
ย ํ์ผ)๋ ๊ทธ ์์ฒด๋ก๋ ์ปดํจํฐ๊ฐ ๋ฐ๋ก ์์๋ฃ์ง ๋ชปํด์. - ๊ทธ๋์ ํ์ด์ฌ ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ๋๋ก ์ค๊ฐ์์ ํด์ํด์ฃผ๋ 'ํ์ด์ฌ ์คํ ํ๋ก๊ทธ๋จ(์ธํฐํ๋ฆฌํฐ)'์ด ํ์ํด์.
- ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ 'PyQt5'๋ก ์์ ํ๋ฉด์ ๋ง๋ค๊ฑฐ๋, 'Pandas'๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ค๋ฉด, ์ด 'PyQt5'๋ 'Pandas'๋ผ๋ ์ ๋ฌธ ๋๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ค๋ ํ๋ก๊ทธ๋จ ์คํ์ ๊ผญ ํ์ํ์ฃ .
- PyInstaller ๊ฐ์ ๋น๋ ๋๊ตฌ๋ ์ด ์ฝ๋, ํ์ด์ฌ ์คํ๊ธฐ, ์ฌ์ฉ๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ฐ ๋ชจ์ "์ด๋์๋ ์คํ ๊ฐ๋ฅํ ํจํค์ง"๋ก ๋ง๋ค์ด์.
--onedir
ย (ํด๋์งธ ๋ง๋ค๊ธฐ): ํ์ํ ํ์ผ๋ค์ ๊ฐ๊ฐ ๋ ๋ฆฝ๋ ํํ๋กยdist
ย ํด๋ ์์ ํ์ ํด๋์ ์ ์ ๋ฆฌํด๋ฌ์. ์คํ ํ์ผ์ ์๊ณ , ๋๋จธ์ง ํ์ผ๋ค์ ํ์ํ ๋๋ง๋ค ์ด ํด๋์์ ๊ฐ์ ธ๋ค ์จ์.--onefile
ย (ํ์ผ ํ๋๋ก ๋ง๋ค๊ธฐ): ์ด ๋ชจ๋ ํ์ผ๋ค์ ํ๋๋ก ์์ถํด์ ์ต์ง๋ก ๋ญ์ณ์. ์ฌ์ง์ด ์ด ์์ถ์ ํ๊ณ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ '๋์ฐ๋ฏธ ํ๋ก๊ทธ๋จ(๋ถํธ๋ก๋)'๊น์ง ์ด ํ ํ์ผ ์์ ๋ฃ์ด์. ๊ทธ๋ฌ๋๊น ๋น์ฐํ ํ์ผ์ด ์ปค์ง๊ณ , ์คํํ ๋๋ง๋ค ์ด ์์ถ์ ํธ๋๋ผ ์๊ฐ๋ ๋ ๊ฑธ๋ฆฌ๋ ๊ฑฐ์ฃ .
- ์ผ์ ๋น์ :
- ์ด์ฌ:
--onedir
: ์ด์ฟ์ง(๊ฐ๊ตฌ, ์ท, ์ฑ ๋ฑ ๊ฐ์ ํ์ํ ๋ถํ๋ค)์ ์์ง ๊ฐ ๋ฐฉ(ํด๋)์ ์ข ๋ฅ๋ณ๋ก ์ ์ ๋ฆฌํด๋๋ ๊ฑฐ์์. ๋น์ฅ ์ฐ๋ ๋ฆฌ๋ชจ์ปจ(์คํ ํ์ผ)์ ์๊ณ ๊ฐ๋ณ๊ณ , ๋๋จธ์ง ํฐ ๊ฐ๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ค์ ํ์ํ ๋ ๊ทธ ๋ฐฉ์ ๊ฐ์ ์ฐ๋ ๊ฑฐ์ฃ .--onefile
: ๋ชจ๋ ์ด์ฟ์ง์ ํ๋์ ๊ฑฐ๋ํ ๋ง๋ฅ ์์ถ ๊ฐ๋ฐฉ์ ๊พน๊พน ๋๋ฌ ๋ด๋ ๊ฑฐ์์. ๊ฐ๋ฐฉ ํ๋๋ง ์ฎ๊ธฐ๋ฉด ๋๋ ํธํด ๋ณด์ด์ง๋ง, ์ง ์ธ๋ ๋ฐ(๋น๋) ์์ฒญ ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๊ฐ๋ฐฉ ์์ฒด๊ฐ ๋๋ฌด ๋ฌด๊ฒ๊ณ (ํ์ผ ํฌ๊ธฐ), ๋ฌผ๊ฑด ํ๋ ๊บผ๋ด ์ฐ๋ ค๊ณ ํด๋(ํ๋ก๊ทธ๋จ ์คํ) ๊ฐ๋ฐฉ ์ ์ฒด๋ฅผ ๋ค์ ์ด๋ฉฐ ์์ถ์ ํ์ด์ผ ํด์ ๋๋ฆฐ ๊ฑฐ์ฃ .
- ์บ ํ:
--onedir
: ํ ํธ, ์นจ๋ญ, ์ฝํ , ๋ฒ๋ ๋ฑ ์บ ํ ์ฅ๋น๋ฅผ ๊ฐ ๊ฐ๋ฐฉ์ ๋๋ ๋ด๊ณ , ์ฐจ ํธ๋ ํฌ์ ์ ์ ๋ฆฌํด๋๋ ๊ฑฐ์์. ์ค์ ์บ ํ์ฅ์์ ํ์ํ ์ฅ๋น๋ง ์์ ๊บผ๋ด ์ฐ์ฃ .--onefile
: ๋ชจ๋ ์บ ํ ์ฅ๋น๋ฅผ ๊ฑฐ๋ํ ํ๋์ ๋ฐฉ์ํฌ๋ก ๋๋ ๋ง์ ๊ฝ๊ฝ ๋ฌถ๋ ๊ฑฐ์์. ๋ฉ์น๋ ์์ฒญ ์ปค์ง๊ณ , ๋ญ ํ๋ ์ฐ๋ ค๋ฉด ์ ์ฒด๋ฅผ ๋ค ํ์ดํค์ณ์ผ ํด์.
- ์ข ํฉ์ ๋ฌผ์ธํธ:
--onedir
: ๊ณผ์, ์๋ฃ์, ์ฌํ ๋ฑ์ ์ข ๋ฅ๋ณ๋ก ์์ ๋ดํฌ์ ๋ด์ ํฐ ๋ฐ๊ตฌ๋์ ๋ฃ์ด๋ ์ ๋ฌผ์ธํธ.--onefile
: ์ด ๋ชจ๋ ๊ฑธ ๋ฏน์๊ธฐ์ ๊ฐ์์ ํ๋์ ๊ฑฐ๋ํ ์์๋ฐ๋ก ๋ง๋ ๊ฒ. ํ๋๋ก ๋จน๊ธด ํธํ์ง๋ง, ์๋ ๋ชจ์ต๊ณผ ๋ง์ ์๊ธฐ ์ด๋ ต๊ณ , ๋ง๋๋ ๊ณผ์ ๋ ๋ณต์กํ์ฃ .- ์จ๊ฒจ์ง ์์:
- ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ ์์ฒด: ์คํ ํ์ผ ์์๋ ์ฐ๋ฆฌ๊ฐ ์ง ์ฝ๋๋ฟ ์๋๋ผ, ๊ทธ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ ์ ์๋ '๋ฏธ๋ ํ์ด์ฌ ํ๋ก๊ทธ๋จ'์ด ํจ๊ป ๋ค์ด๊ฐ์. ์ด๊ฒ๋ง ํด๋ ์์ญ MB๋ ์ฐจ์งํ ์ ์์ด์.
- ์์กด์ฑ์ ๋ช (Dependency Hell): ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์:ย
requests
)๊ฐ ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์:ยurllib3
,ยcharset-normalizer
)๋ฅผ ํ์๋ก ํ๊ณ , ๊ทธ๊ฒ๋ค์ด ๋ ๋ค๋ฅธ ๊ฒ์ ํ์๋ก ํ๋ ์์ผ๋ก '์น๊ตฌ์ ์น๊ตฌ'๊น์ง ์ค์ค์ด ๋ธ๋ ค์์. ๊ทธ๋์ ๋ด๊ฐ ์ง์ ์ค์นํ ๊ฑด ๋ช ๊ฐ ์ ๋ผ๋ ์ค์ ํฌํจ๋๋ ๊ฑด ์์ญ, ์๋ฐฑ ๊ฐ๊ฐ ๋ ์ ์์ด์. - PyInstaller์ ๋ถํธ๋ก๋ (Bootloader):ย
--onefile
๋ก ๋ง๋ค ๋, ์คํ ํ์ผ ๋งจ ์๋ถ๋ถ์๋ PyInstaller๊ฐ ์ฌ์ด๋์ '๋ง์ค๋ฌผ ํ๋ก๊ทธ๋จ'์ด ์์ด์. ์๊ฐ ์คํ๋๋ฉด ์จ๊ฒจ์ง ๋ด์ฉ๋ฌผ(์์ถ๋ ํ์ผ๋ค)์ ์์ ํด๋์ ์ฃผ๋ฅด๋ฅต ํ๊ณ , ๊ทธ์ ์ผ ์ง์ง ํ๋ก๊ทธ๋จ์ด ์์๋๋ ๊ฑฐ์ฃ . ์ด ๋ถํธ๋ก๋๋ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ฐจ์งํด์. - GUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณต์ก์ฑ (PyQt5 ๋ฑ): ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฝ๋ ์ธ์๋ ์์ด์ฝ, ํฐํธ, ๋ฒ์ญ ํ์ผ, ํ๋ฉด ๊ตฌ์ฑ ์์(์์ ฏ) ๋ฑ ๋ค์ํ ์์ํ ํ์ผ๋ค์ ๋ง์ด ํ์๋ก ํด์. ์ด๋ฐ ๊ฒ๋ค์ด ๋ค ํฌํจ๋๋ฉด ์ฉ๋์ด ํ ๋์ด๋์ฃ .
๐ ๏ธ ํด๊ฒฐ ์ค๊ณ๋
- [์ฒซ ๋ฒ์งธ ๋จ๊ณ: "ํด๋์งธ ๋ง๋ค๊ธฐ (--onedir)"๋ก ์ ๋ต ๋ณ๊ฒฝ]
- ํต์ฌ ํ๋: PyInstaller ๋น๋ ๋ช
๋ น์์ย
--onefile
ย ๋์ ย--onedir
ย ์ต์ ์ ์ฌ์ฉํ๋ค. - ์คํ ๊ฐ์ด๋:
- ํ์ด์ฌ ํ๋ก์ ํธ์ ๋น๋ ์คํฌ๋ฆฝํธ(์:ย
exe.py
ย ๋๋ ์ง์ ํฐ๋ฏธ๋์ ์ ๋ ฅํ๋ ๋ช ๋ น์ด)๋ฅผ ์ฐพ์ผ์ธ์. pyinstaller
ย ๋ช ๋ น์ด ๋ถ๋ถ์์ย"--onefile"
์ด๋ผ๊ณ ๋ ๋ถ๋ถ์ ์ฐพ์์ ์ญ์ ํ๊ฑฐ๋ ์์ย#
๋ฅผ ๋ถ์ฌ ์ฃผ์ ์ฒ๋ฆฌํ์ธ์.- ๋์ ย
"--onedir"
์ด๋ผ๋ ์ต์ ์ ์ถ๊ฐํ์ธ์. - ๋ง์ฝย
exe.py
ย ๊ฐ์ ์คํฌ๋ฆฝํธ์์ ๋น๋ ํ ์์ฑ๋ ์คํ ํ์ผ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ ๋ก์ง์ด ์๋ค๋ฉด, ๊ทธ ๊ฒฝ๋ก๊ฐยdist\[์ฑ์ด๋ฆ]
ย ํด๋ ์์ย[์ฑ์ด๋ฆ].exe
๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์์ ํด์ผ ํด์. (์ด์ ๋ํ์์ ์ด๋ฏธ ์์ ํ์ด์!) - ๋น๋ ์๋ฃ ํ ์ฌ์ฉ์์๊ฒ ์๋ดํ๋ ๋ฉ์์ง๋ "dist ํด๋ ์์ย
[์ฑ์ด๋ฆ]
ย ํด๋ ์ ์ฒด๋ฅผ ์ฌ์ฉํ์ธ์"๋ผ๊ณ ๋ฐ๊ฟ์ฃผ๋ฉด ์ข์์. (์ด๊ฒ๋ ์ด๋ฏธ ์์ ํ์ฃ !)
- ์ฑ๊ณต ์งํ:
- ๋น๋ ์๊ฐ์ด ๋์ ๋๊ฒ ์ค์ด๋ ๋ค. (๋ช ๋ถ ๊ฑธ๋ฆฌ๋ ๊ฒ ๋ช์ญ ์ด๋ก!)
dist
ย ํด๋ ์์ย--name
์ผ๋ก ์ง์ ํ ์ด๋ฆ์ ํ์ ํด๋๊ฐ ์๊ธฐ๊ณ , ๊ทธ ์์ ์คํ ํ์ผ(.exe
)๊ณผ ์ฌ๋ฌ ๋ค๋ฅธ ํ์ผ, ํด๋๋ค์ด ๋ณด์ธ๋ค.- ํ์ ํด๋ ์์ ์คํ ํ์ผ(
.exe
) ์์ฒด์ ํฌ๊ธฐ๋ ๋งค์ฐ ์์์ ธ ์๋ค. (์์ญ KB ~ ๋ช MB ์์ค) - ํ๋ก๊ทธ๋จ์ ์คํํ์ ๋ ์์ ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ ๋๋ ์ ์๋ค.
- ์์/์ฝ๋ย (ํฐ๋ฏธ๋ ๋ช ๋ น์ด ๊ธฐ์ค):
# ๋ณ๊ฒฝ ์ python -m PyInstaller --onefile --name=๋ดํ๋ก๊ทธ๋จ main.py # ๋ณ๊ฒฝ ํ python -m PyInstaller --onedir --name=๋ดํ๋ก๊ทธ๋จ main.py # ํต์ฌ ๋ณํ ์ค๋ช # --onefile ์ต์ ์ ๋นผ๊ณ --onedir ์ต์ ์ ๋ฃ์์ด์. # ์ด์ 'dist' ํด๋ ์์ '๋ดํ๋ก๊ทธ๋จ'์ด๋ผ๋ ํด๋๊ฐ ์๊ธฐ๊ณ , # ๊ทธ ์์ ์คํ ํ์ผ๊ณผ ํ์ํ ๋ถ์ ํ์ผ๋ค์ด ๊ฐ์ด ๋ค์ด์์ ๊ฑฐ์์.
- ์ฃผ์์ฌํญ:
- ๋ค๋ฅธ ์ฌ๋์๊ฒ ํ๋ก๊ทธ๋จ์ ์ค ๋๋ย
dist\[์ฑ์ด๋ฆ]
ย ํด๋ย ์ ์ฒด๋ฅผ ์์ถํด์ ์ ๋ฌํด์ผ ํด์. ์คํ ํ์ผ ํ๋๋ง ๋๋ ์ฃผ๋ฉด ์ ๋์๊ฐ์. - ์ฌ์ฉ์๋ ๊ทธ ํด๋ ์์ ์คํ ํ์ผ(
.exe
)์ ์ง์ ์ฐพ์์ ์คํํด์ผ ํด์.
- [๋ ๋ฒ์งธ ๋จ๊ณ: "๊ฐ์ํ๊ฒฝ"์ผ๋ก ์์ ์ค ๊นจ๋์ด ์ ๋ฆฌํ๊ธฐ]
- ํต์ฌ ํ๋: ํ๋ก์ ํธ๋ง๋ค ๋ ๋ฆฝ๋ ํ์ด์ฌ ์์ ํ๊ฒฝ(๊ฐ์ํ๊ฒฝ)์ ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์๋ ๋ฑ ๊ทธ ํ๋ก์ ํธ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ค์นํ๋ค.
- ์คํ ๊ฐ์ด๋:
- ์ ํ๋ก์ ํธ ํด๋๋ฅผ ๋ง๋ค ๋๋ง๋ค, ๋๋ ๊ธฐ์กด ํ๋ก์ ํธ๋ผ๋ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ก ๊ฐ์ํ๊ฒฝ์ ๋ง๋์ธ์. (์:ย
myenv
๋ผ๋ ์ด๋ฆ์ผ๋ก)
python -m venv myenv
- ๋ง๋ ๊ฐ์ํ๊ฒฝ์ ํ์ฑํํ์ธ์.
- Windows:ย
myenv\Scripts\activate
- macOS/Linux:ย
source myenv/bin/activate
- ์ด์ ์ด ํ์ฑํ๋ ํ๊ฒฝ์์ย
pip install ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฆ
ย ๋ช ๋ น์ผ๋ก ํ์ํ ๊ฒ๋ค๋ง ์ค์นํ์ธ์. (์:ยpip install pyqt5 pandas
) - PyInstaller๋ก ๋น๋ํ ๋๋ ๋ฐ๋์ ์ด ๊ฐ์ํ๊ฒฝ์ด ํ์ฑํ๋ ํฐ๋ฏธ๋์์ ์คํํ์ธ์.
- ์ฑ๊ณต ์งํ:
- PyInstaller๊ฐ ์๋ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์์ ์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ค์นํ๋ ๊ฒ๋ค)๋ฅผ ํฌํจ์ํค๋ ์ผ์ด ์ค์ด๋ ๋ค.
- ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํฌ๊ธฐ๊ฐ (์กฐ๊ธ์ด๋ผ๋) ๋ ์ต์ ํ๋ ์ ์๋ค.
- ํ๋ก์ ํธ๋ณ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฌ์์ ธ์ "๋ด ์ปดํจํฐ์์ ์ ๋๋๋ฐ, ์ ๋น๋๋ง ํ๋ฉด ์ ๋์ง?" ํ๋ ๋ฌธ์ ๊ฐ ์ค์ด๋ ๋ค.
- ์์/์ฝ๋: ํด๋น ์์ (ํฐ๋ฏธ๋ ๋ช ๋ น์ด ์ฌ์ฉ)
- ์ฃผ์์ฌํญ:
- ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค๊ณ ํ์ฑํํ๋ ๊ฒ์ ์์ผ๋ฉด ์๋ฌด ์์ฉ์์ด์!
- ํ์๊ณผ ํ์
ํ ๋๋ย
requirements.txt
ย ํ์ผ (์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก)์ ๊ณต์ ํด์ ๋ชจ๋ ๋์ผํ ํ๊ฒฝ์ ๋ง๋ค ์ ์๋๋ก ํ๋ ๊ฒ ์ข์์. (pip freeze > requirements.txt
๋ก ๋ง๋ค๊ณ ,ยpip install -r requirements.txt
๋ก ์ค์น)
- [์ธ ๋ฒ์งธ ๋จ๊ณ: (๊ณ ๊ธ์์ฉ)ย .specย ํ์ผ ํํํ๋ฉฐ ๋ค์ด์ดํธ ์๋]
- ํต์ฌ ํ๋: PyInstaller๊ฐ ์๋์ผ๋ก ์์ฑํ๋ย
.spec
ย ํ์ผ์ ์ง์ ์์ ํ์ฌ ๋น๋ ๊ณผ์ ์ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ๊ณ , ๋ถํ์ํ ํ์ผ์ด๋ ๋ชจ๋์ ์ ๊ทน์ ์ผ๋ก ์ ์ธํ๋ค. - ์คํ ๊ฐ์ด๋:
- PyInstaller๋ฅผ ์ฒ์ ์คํํ๋ฉด (
.spec
ย ํ์ผ์ด ์์ ๋)ย๋ดํ๋ก๊ทธ๋จ.spec
ย ํ์ผ์ด ์๋์ผ๋ก ์๊ฒจ์. - ์ดย
.spec
ย ํ์ผ์ ํ ์คํธ ํธ์ง๊ธฐ๋ก ์ด์ด๋ณด์ธ์. ํ์ด์ฌ ์ฝ๋์ฒ๋ผ ์๊ฒผ์ด์. Analysis
ย ๊ฐ์ฒด์ยexcludes
ย ๋ฆฌ์คํธ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ณ ์ถ์ ๋ชจ๋ ์ด๋ฆ์ ๋ฌธ์์ด๋ก ์ถ๊ฐํ ์ ์์ด์. (์:ยexcludes=['tkinter', 'unittest']
ย ๋ง์ฝ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด)datas
ย ๋ฆฌ์คํธ๋ฅผ ํ์ธํด์ ํน์ ๋ถํ์ํ ๋ฐ์ดํฐ ํ์ผ์ด ํฌํจ๋๊ณ ์์ง๋ ์์์ง ์ดํด๋ณด์ธ์.- ์์ ํย
.spec
ย ํ์ผ๋ก ๋น๋ํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ยpyinstaller ๋ดํ๋ก๊ทธ๋จ.spec
ย ๋ช ๋ น์ ์ฌ์ฉํด์.
- ์ฑ๊ณต ์งํ:
- ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ํฌ๊ธฐ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ๋ ์ค์ด๋ค ์ ์๋ค.
- ๋น๋ ๊ณผ์ ์ ๋ ๊น์ด ์ดํดํ๊ฒ ๋๋ค.
- ์์/์ฝ๋ย (
.spec
ย ํ์ผ ๋ด์ฉ ์ผ๋ถ):
# ๋ณ๊ฒฝ ์ (์๋ ์์ฑ๋ .spec ํ์ผ ์ผ๋ถ) # a = Analysis(['main.py'], # pathex=['E:\\dev\\myproject'], # binaries=[], # datas=[], # hiddenimports=[], # hookspath=[], # ...) # ๋ณ๊ฒฝ ํ (excludes ์ถ๊ฐ) a = Analysis(['main.py'], pathex=['E:\\dev\\myproject'], binaries=[], datas=[], hiddenimports=[], hookspath=[], excludes=['tkinter', 'PyQt5.QtWebEngineWidgets', 'IPython'], # ์ฌ์ฉ ์ ํ๋ ๊ฒ๋ค ์ ์ธ! ...) # ํต์ฌ ๋ณํ ์ค๋ช # Analysis ์ค์ ์ excludes ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํด์, ๋ด ํ๋ก๊ทธ๋จ์ด ์ ํ ์ฌ์ฉํ์ง ์๋ # tkinter, PyQt5์ ์น์์ง, IPython ๊ฐ์ ๋ฌด๊ฑฐ์ด ๋ชจ๋๋ค์ ๋น๋ํ ๋ ์์ ๋นผ๋ฒ๋ฆฌ๋๋ก ํ์ด์.
- ์ฃผ์์ฌํญ:
- ๋งค์ฐ ์ ์คํด์ผ ํด์!ย ์๋ชป ์ ์ธํ๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ ๊ผญ ํ์ํ ๊ฒ๊น์ง ๋น ์ ธ์ ์ค๋ฅ๊ฐ ํํ ๋ ์ ์์ด์. ํ๋์ฉ ์ ์ธํ๊ณ ํ ์คํธํ๋ ์ธ๋ด์ฌ์ด ํ์ํด์.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ด๋ ์ ๋ ์์์ผ ํจ๊ณผ์ ์ผ๋ก ์ ์ธํ ์ ์์ด์.
- ์ด ๋ฐฉ๋ฒ์ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ด ๋ง์ด ๋ค ์ ์๊ณ , ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ ์๋ ์์ด์.ย
--onedir
์ ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ์ด ํจ์ฌ ๊ฐ์ฑ๋น ์ข์ ํด๊ฒฐ์ฑ ์ผ ๋๊ฐ ๋ง์์.
๐ง ํต์ฌ ๊ฐ๋ ํด๋ถ
- [๊ฐ๋ 1]: PyInstaller (ํ์ด์ธ์คํจ๋ฌ) - ํ์ด์ฌ ํ๋ก๊ทธ๋จ ํ๋ฐฐ ํฌ์ฅ ์ ๋ฌธ๊ฐ
- 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด: "๋ค๊ฐ ํ์ด์ฌ ๋๋ผ ๋ง๋ก ๋ง๋ ๋ฉ์ง ์ฅ๋๊ฐ(ํ๋ก๊ทธ๋จ)์ ๋ค๋ฅธ ๋๋ผ ์น๊ตฌ(ํ์ด์ฌ ์ ๊น๋ฆฐ ์ปดํจํฐ)์๊ฒ ๋ณด๋ด๊ณ ์ถ์ ๋, ์ด ์ฅ๋๊ฐ์ด๋ ์ฅ๋๊ฐ ์ฌ์ฉ ์ค๋ช ์(ํ์ด์ฌ ์คํ๊ธฐ), ๊ทธ๋ฆฌ๊ณ ์ฅ๋๊ฐ์ ํ์ํ ๋ชจ๋ ๋ถํ(๋ผ์ด๋ธ ฯฮตฯฮนฯฯฯฯฮต)๊น์ง ์น ๋ค ํ๋์ ์ ๋ฌผ ์์์ ์์๊ฒ ํฌ์ฅํด์ฃผ๋ ์์ ์จ์ผ! ์ด ์์ ์จ ๋๋ถ์ ์น๊ตฌ๋ ํ์ด์ฌ ๋๋ผ ๋ง์ ๋ชฐ๋ผ๋ ๋ค ์ฅ๋๊ฐ์ ๋ฐ๋ก ๊ฐ์ง๊ณ ๋ ์ ์์ด."
- ์ค์ํ ์์:
- ์ฌํ์ฉ ๋ง๋ฅ ์ด๋ํฐ: ์ ์ธ๊ณ ์ด๋๋ฅผ ๊ฐ๋ ๋ด ์ ์๊ธฐ๊ธฐ๋ฅผ ์ธ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ฒ๋ผ, PyInstaller๋ ํ์ด์ฌ์ด ์๋ ์ด๋ค PC์์๋ ๋ด ํ๋ก๊ทธ๋จ์ ๋๋ฆด ์ ์๊ฒ ํด์ค์.
- ๊น๋ฐฅ: ๋ฐฅ, ๋จ๋ฌด์ง, ๊ณ๋, ์๊ธ์น ๋ฑ(์ฝ๋, ์คํ๊ธฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ๊น(์คํ ํ์ผ) ํ๋๋ก ๋ง์์ ์ด๋์๋ ๊ฐํธํ๊ฒ ๋จน์ ์ ์๊ฒ ํด์ค์.
- ์จ๊ฒจ์ง ์ค์์ฑ: ์ด๊ฒ ์์ผ๋ฉด, ๋ด ํ์ด์ฌ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฃผ๋ ค๋ฉด "๋จผ์ ํ์ด์ฌ ์ค์นํ์๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค ์ค์นํ์ ์ผ ํด์"๋ผ๊ณ ์ผ์ผ์ด ์๋ดํด์ผ ํ๋ ๋์ฐธ์ฌ๊ฐ ๋ฒ์ด์ ธ์. ์ฆ, ํ๋ก๊ทธ๋จ ๋ฐฐํฌ์ ๋์ด๋๋ฅผ ํ ๋ฎ์ถฐ์ฃผ๋ ๊ณ ๋ง์ด ์กด์ฌ์์.
- ์คํด์ ์ง์ค:
- ์คํด: "PyInstaller๋ ๋ด ํ์ด์ฌ ์ฝ๋๋ฅผ C์ธ์ด๋ ๊ธฐ๊ณ์ด์ฒ๋ผ ์์ฒญ ๋น ๋ฅธ ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ง๋ฒ์ฌ๋ค!"
- ์ง์ค: "์๋์์! ์ฝ๋๋ฅผ ๋ฒ์ญํด์ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ ์๋๋ผ, ์ฝ๋๋ฅผ ์คํํ ์ ์๋ 'ํ์ด์ฌ ํ๊ฒฝ'๊ณผ ํจ๊ป 'ํต์งธ๋ก ํฌ์ฅ'ํด์ฃผ๋ ๊ฑฐ์์. ๊ทธ๋์ ์๋ ํฅ์๋ณด๋ค๋ '์ด๋์๋ ์คํ ๊ฐ๋ฅ'ํ๊ฒ ๋ง๋๋ ๋ฐ ์ฃผ ๋ชฉ์ ์ด ์์ด์."
- [๊ฐ๋ 2]:ย --onefileย vs.ย --onedirย - ์ด์ฟ์ง ์ธ๋ ๋ ๊ฐ์ง ์คํ์ผ
- 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด:
--onefile
ย (ํ๊ฐ๋ฐฉ ์คํ์ผ): "๋ค ๋ฐฉ์ ์๋ ๋ชจ๋ ์ฅ๋๊ฐ, ์ฑ , ์ท์ ํ๋์ ์์ฒญ ํฐ ๋ง๋ฒ ๊ฐ๋ฐฉ์ ๊พน๊พน ๋๋ฌ ๋ด๋ ๊ฑฐ์ผ. ๊ฐ๋ฐฉ ํ๋๋ง ๋ค๊ณ ๋ค๋๋ฉด ๋๋๊น ํธํด ๋ณด์ด์ง๋ง, ๊ฐ๋ฐฉ์ด ๋๋ฌด ๋ฌด๊ฒ๊ณ , ๋ญ ํ๋ ๊บผ๋ด๋ ค๋ฉด ํ์ฐธ ๋ค์ ธ์ผ ํด."--onedir
ย (๋ถ๋ฆฌ์๋ฉ ์คํ์ผ): "์ฅ๋๊ฐ์ ์ฅ๋๊ฐ ์์์, ์ฑ ์ ์ฑ ๊ฝ์ด์, ์ท์ ์๋์ ์ข ๋ฅ๋ณ๋ก ๋๋ ๋ด๋ ๊ฑฐ์ผ. ๋ฌผ๊ฑด ์ฐพ๊ธฐ๋ ์ฝ๊ณ , ํ์ํ ๊ฒ๋ง ์์ ๊บผ๋ด ์ธ ์ ์์ด์ ๊ฐ๋ณ๊ณ ๋นจ๋ผ."- ์ค์ํ ์์:
--onefile
: ๋ชจ๋ ๋ฐ์ฐฌ์ ํ ๊ทธ๋ฆ์ ๋ค ๋น๋ฒผ๋์ ๋น๋น๋ฐฅ. (ํธํ์ง๋ง ๊ฐ ์ฌ๋ฃ์ ๋ง์ ์์)--onedir
: ์ฌ๋ฌ ๊ฐ์ง ๋ฐ์ฐฌ์ ๊ฐ ์ ์์ ์์๊ฒ ๋ด์ ์ฐจ๋ฆฐ ํ์ ์. (๋ณด๊ธฐ ์ข๊ณ ๊ฐ์ ๋ง์ ์ฆ๊ธธ ์ ์์)--onefile
: ๋ง๋ฅ ๋งฅ๊ฐ์ด๋ฒ์นผ ํ๋. (๋ค์ํ ๊ธฐ๋ฅ์ด ์์ง๋ง ํ๋ํ๋์ ์ฑ๋ฅ์ ์ ๋ฌธ ๋๊ตฌ๋ณด๋ค ๋จ์ด์ง ์ ์์)--onedir
: ์ ์ ๋ฆฌ๋ ๊ณต๊ตฌํจ ์์ ๋ง์น, ๋๋ผ์ด๋ฒ, ํ์น. (๊ฐ ๋๊ตฌ๊ฐ ์ ์ญํ ํ์คํ ํจ)- ์จ๊ฒจ์ง ์ค์์ฑ: ๋จ์ํ ํ์ผ์ด ํ๋๋ ์ฌ๋ฌ ๊ฐ๋์ ๋ฌธ์ ๊ฐ ์๋์์. ๋น๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ, ๋ง๋ค์ด์ง ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ, ํ๋ก๊ทธ๋จ์ ์์ํ๋ ์๋, ๋์ค์ ๋ฌธ์ ์๊ฒผ์ ๋ ์์ธ ์ฐพ๋ ๋์ด๋๊น์ง ๋ชจ๋ ๊ฒ์ ์ํฅ์ ์ค์.
- ์คํด์ ์ง์ค:
- ์คํด: "
--onefile
์ด ๋ฌด์กฐ๊ฑด ๋ ๊น๋ํ๊ณ ์ ๋ฌธ๊ฐ์ค๋ฌ์ ๋ณด์ธ๋ค." - ์ง์ค: "๊ฒ๋ณด๊ธฐ์ ๊น๋ํ ์ ์์ง๋ง, ๊ทธ ํธ๋ฆฌํจ์ ๋๊ฐ๋ก ๋น๋ ์๊ฐ, ํ์ผ ํฌ๊ธฐ, ์คํ ์๋์์ ํฐ ์ํด๋ฅผ ๋ณผ ์ ์์ด์. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ํนํ ํ๋ก๊ทธ๋จ์ด ๋ณต์กํ๊ณ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์์๋กย
--onedir
๊ฐ ํจ์ฌ ๋ ํจ์จ์ ์ด๊ณ ํ๋ช ํ ์ ํ์ด์์." - [๊ฐ๋ 3]: ์์กด์ฑ (Dependencies) - ๋ด ํ๋ก๊ทธ๋จ์ ์จ๊ฒจ์ง ์กฐ๋ ฅ์๋ค์ด์ ์ง๊พผ๋ค
- 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด: "๋ค๊ฐ ๋ฉ์ง ๋ก๋ด์ ๋ง๋ค๋ ค๋ฉด ํ ๋ถํ, ๋ค๋ฆฌ ๋ถํ, ๋จธ๋ฆฌ ๋ถํ์ด ํ์ํ์ง? ๊ทธ๊ฒ ๋ฐ๋ก '์์กด์ฑ'์ด์ผ, ๋ก๋ด์ ์์ฑํ๋ ๋ฐ ๊ผญ ํ์ํ ์น๊ตฌ๋ค์ด์ง. ๊ทธ๋ฐ๋ฐ ํ ๋ถํ์ ๋ง๋ค๋ ค๋ฉด ๋ ์์ ๋์ฌ๋ ์คํ๋ง์ด ํ์ํ ์ ์์์? ๊ทธ ๋์ฌ๋ ์คํ๋ง๋ ๋ก๋ด์ ์จ๊ฒจ์ง ์์กด์ฑ ์น๊ตฌ๋ค์ด์ผ."
- ์ค์ํ ์์:
- ์๋์ฐจ ๋ง๋ค๊ธฐ: ์๋์ฐจ๋ฅผ ๋ง๋ค๋ ค๋ฉด ์์ง, ๋ฐํด, ํธ๋ค, ์ฐจ์ฒด๊ฐ ํ์ํด์ (์ง์ ์ ์ธ ์์กด์ฑ). ๊ทธ๋ฐ๋ฐ ์์ง์ ๋ง๋ค๋ ค๋ฉด ๋ ํผ์คํค, ์ ํ ํ๋ฌ๊ทธ ๊ฐ์ ๋ถํ๋ค์ด ํ์ํ๊ณ , ๋ฐํด๋ฅผ ๋ง๋ค๋ ค๋ฉด ๊ณ ๋ฌด๋ ํ ์ด ํ์ํ์ฃ (๊ฐ์ ์ ์ธ ์์กด์ฑ).
- ๊น์น์ฐ๊ฐ ๋์ด๊ธฐ: ๊น์น์ฐ๊ฐ๋ฅผ ๋์ด๋ ค๋ฉด ๊น์น, ๋ผ์ง๊ณ ๊ธฐ, ๋๋ถ, ํ๊ฐ ํ์ํด์. ์ด๊ฒ ์ง์ ์ ์ธ ์์กด์ฑ์ด์์. ๊ทธ๋ฐ๋ฐ ๊น์น๋ ๋ฐฐ์ถ, ๊ณ ์ถง๊ฐ๋ฃจ, ๋ง๋ ๋ฑ์ผ๋ก ๋ง๋ค์ฃ . ์ด๊ฒ ๊ฐ์ ์ ์ธ ์์กด์ฑ์ด๊ณ ์.
- ์จ๊ฒจ์ง ์ค์์ฑ: ๋ด๊ฐ "๋ฑ 3๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ผ๋๋ฐ ์ ์ด๋ ๊ฒ ํ์ผ์ด ์ปค?"๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ๊ทธ 3๊ฐ๊ฐ ๊ฐ๊ฐ ๋ ๋ค๋ฅธ ์์ญ ๊ฐ์ '๋์ฐ๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ'๋ฅผ ๋ฐ๋ ค์์ ์คํ ํ์ผ ์์ ๊ฐ์ด ์ด๋ฆผ์ ์ฐจ๋ฆฌ๊ธฐ ๋๋ฌธ์ด์์. ์ด '๋ธ๋ ค์ค๋ ์๊ตฌ๋ค'์ด ํ์ผ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ์ฃผ๋ฒ ์ค ํ๋์ฃ .
- ์คํด์ ์ง์ค:
- ์คํด: "๋ด๊ฐย
import
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์๋งํผ๋ง ์คํ ํ์ผ์ ํฌํจ๋ ๊ฒ์ด๋ค." - ์ง์ค: "์ฒ๋ง์ ๋ง์! ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์๋ํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ ๋ค๋ฅธ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊น์ง... ๋ง์น ์ํ ๊ป์ง์ฒ๋ผ ์ค์ค์ด ํฌํจ๋ ์ ์์ด์. ๊ทธ๋์ '์์กด์ฑ ํธ๋ฆฌ'๋ผ๋ ๊ฑธ ๊ทธ๋ ค๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๊ฑฐ๋ํ ๋คํธ์ํฌ๊ฐ ๋ํ๋๊ธฐ๋ ํด์."
๐ฎ ๋ฏธ๋ ์ ๋ต ๋ฐ ์งํ
- ์๋ฐฉ ์ ๋ต:
- ํ๋ก์ ํธ ์์์ ๋ฌด์กฐ๊ฑด "๊นจ๋ํ ๋ฐฉ(๊ฐ์ํ๊ฒฝ)"์์!: ์ ํ์ด์ฌ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ ๋ฐ๋์ ๊ทธ ํ๋ก์ ํธ๋ง์ ์ํ ๋
๋ฆฝ๋ ์์
๊ณต๊ฐ(๊ฐ์ํ๊ฒฝ)์ ๋ง๋์ธ์. ๊ฑฐ๊ธฐ์ ๋ฑ ํ์ํ ์ต์ํ์ ๋๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ง ์ค์นํ๋ ์ต๊ด์ ๋ค์ด๋ฉด, ๋์ค์ ๋น๋ํ ๋ ์๋ฑํ ์ก๋์ฌ๋๊ฐ ๋ธ๋ ค ๋ค์ด์์ ํ์ผ ํฌ๊ธฐ๊ฐ ๋ปฅํ๊ธฐ๋๋ ๊ฑธ ๋ง์ ์ ์์ด์. (์:ย
python -m venv my_project_env
ย ->ยmy_project_env\Scripts\activate
ย ->ยpip install ํ์ํ๊ฒ๋ง
) --onedir
(ํด๋์งธ ๋ง๋ค๊ธฐ)๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์๊ฐํ๊ธฐ: ํนํ ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋, PyQt5, Pandas์ฒ๋ผ ๋ฉ์น ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ ๋๋ย--onedir
๋ก ๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ ๋น๋ํด์ ์์ฃผ ํ ์คํธํ๋ ๊ฒ ์ ์ ๊ฑด๊ฐ์ ์ข์์. "ํ์ผ ํ๋๋ก ์์๊ฒ ๋ง๋ค์ด์ผ์ง!" ํ๋ ์๊ฐ์ ๋ชจ๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ๊ณผ ํ ์คํธ๊ฐ ๋๋ ๋ค, ์ ๋ง ํ์ํ ๋๋ง ์ตํ์ ์ต์ ์ผ๋ก ๊ณ ๋ คํ์ธ์.- "๊ฐ๋ฒผ์ด ๋๊ตฌ"๋ฅผ ์ฐพ์๋ณด๋ ๋ ธ๋ ฅ: ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, ํน์ ๋ ์๊ณ ์์กด์ฑ์ด ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ง ํ ๋ฒ์ฏค ๊ฒ์ํด๋ณด๋ ์ต๊ด๋ ์ข์์. ๋ฌผ๋ก ํญ์ ๊ฐ๋ฅํ ๊ฑด ์๋์ง๋ง, ์ด๋ฐ ๊ณ ๋ฏผ ์์ฒด๊ฐ ๋์ค์ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ค ์ ์์ด์.
- ์ฅ๊ธฐ์ ๊ณ ๋ ค์ฌํญ: "์ธ์์ ๊ณต์ง ์ ์ฌ์ ์๋ค."ย
--onefile
์ด๋ผ๋ ํธ๋ฆฌํจ ๋ค์๋ ๋ณด์ด์ง ์๋ ๋น์ฉ(ํฐ ํ์ผ ํฌ๊ธฐ, ๊ธด ๋น๋ ์๊ฐ, ๋๋ฆฐ ์คํ ์๋)์ด ์จ์ด์๋ค๋ ๊ฒ์ ํญ์ ๊ธฐ์ตํ์ธ์. ์ด๋ค ๊ธฐ์ ์ด๋ ๊ทธ ์๋ ์๋ฆฌ๋ฅผ ์ด๋ ดํ์ด๋๋ง ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ฉด, ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ํค๋งค์ง ์๊ณ ์ค๋ง๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฐ ํฐ ๋์์ด ๋ผ์. - ์ ๋ฌธ๊ฐ ์ฌ๊ณ ๋ฐฉ์: "๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋จ์ํ ์ฝ๋ ๋ฉ์ด๋ฆฌ๊ฐ ์๋๋ผ, ํ๋์ ๋ ๋ฆฝ๋ '๋ฏธ๋ ์ํํธ์จ์ด ํจํค์ง'๋ค. ์ด๋ค ๋ถํ(๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ฐ์ดํฐ)์ด ์ผ๋ง๋ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๋์ง, ๋น๋ ๊ณผ์ ์์ ์ด๋ค ์์ ์ด ์๊ฐ์ ๋ง์ด ์ก์๋จน๋์ง ๋ถ์์ ์ผ๋ก ๋ฐ๋ผ๋ณธ๋ค. ๋ชจ๋ ์ ํ(์ต์ )์๋ ์ฅ์ ๊ณผ ๋จ์ ์ด ์์ผ๋ฏ๋ก, ํ์ฌ ์ํฉ(๊ฐ๋ฐ ๋จ๊ณ, ๋ฐฐํฌ ๋์, ์ฌ์ฉ์ ํ๊ฒฝ ๋ฑ)์ ๊ฐ์ฅ ์ ํฉํ '๊ท ํ์ '์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค."
- ํ์ต ๋ก๋๋งต:
- ์ด๊ธ: PyInstaller ๊ณต์ ํํ์ด์ง์ ํํ ๋ฆฌ์ผ๊ณผ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ(FAQ) ์ฝ์ด๋ณด๊ธฐ. (์์ด์ง๋ง ์์ฆ์ ๋ฒ์ญ๊ธฐ ์ฑ๋ฅ์ด ์ข์์!) ์ ํ๋ธ์์ "PyInstaller tutorial", "PyInstaller reduce exe size" ๊ฐ์ ํค์๋๋ก ๊ฒ์ํด์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๋ป๊ฒ ์ฐ๋์ง ๊ตฌ๊ฒฝํ๊ธฐ.
- ์ค๊ธ: PyInstaller ๊ณต์ ๋ฌธ์์์ "Advanced Topics" ๋ถ๋ถ์ด๋ย
.spec
ย ํ์ผ ์์ฑ๋ฒ ์์ธํ ์ดํด๋ณด๊ธฐ. Stack Overflow ๊ฐ์ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ PyInstaller ๊ด๋ จ ๋ฌธ์ ํด๊ฒฐ ์ฌ๋ก๋ค ์ฐพ์๋ณด๊ธฐ.ยpipdeptree
ย ๊ฐ์ ๋๊ตฌ๋ก ๋ด ํ๋ก์ ํธ์ ์์กด์ฑ ๊ตฌ์กฐ๋ฅผ ์ง์ ๋์ผ๋ก ํ์ธํด๋ณด๊ธฐ. - ๊ณ ๊ธ: (์ ๋ง ๊น๊ฒ ํ๊ณ ๋ค๊ณ ์ถ๋ค๋ฉด) Nuitka์ฒ๋ผ ํ์ด์ฌ ์ฝ๋๋ฅผ C์ธ์ด๋ก ๋ณํํด์ ์ปดํ์ผํ๋ ๋ค๋ฅธ ์ข ๋ฅ์ ํจํค์ง ๋๊ตฌ๋ ํ๋ฒ ๊ตฌ๊ฒฝํด๋ณด์ธ์. ํ์ด์ฌ์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ C์ธ์ด์ ์ํธ์์ฉํ๋์ง (CPython internals, C API) ๊ฐ์ ์ฃผ์ ๋ฅผ ์ด์ง ๋ง๋ณด๋ ๊ฒ๋ ์ข์์.
๐ ์ค์ ์ ์ฉ ์ฒญ์ฌ์ง
- ์ฆ์ ์ ์ฉ:
- ์ง๊ธ ๋น์ฅ!ย ๋ค์ ๋ฒ ํ์ด์ฌ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋, (๋๋ ์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ๋ผ๋) ๊ฐ์ํ๊ฒฝ๋ถํฐ ๋ง๋์ธ์. (
python -m venv .venv
ย ์ถ์ฒ!) - ์ง๊ธ๊น์งย
--onefile
๋ก ๋น๋ํ๋ค๋ฉด, ๋ฐ๋กย--onedir
ย ์ต์ ์ผ๋ก ๋ฐ๊ฟ์ ๋น๋ํด๋ณด๊ณ ๋น๋ ์๊ฐ๊ณผ ๊ฒฐ๊ณผ๋ฌผ ํฌ๊ธฐ๋ฅผ ์ง์ ๋น๊ตํด๋ณด์ธ์. "์!" ์๋ฆฌ๊ฐ ๋์ฌ ์๋ ์์ด์. - ๋ด๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ๊ณผ ํจ๊ป "PyInstaller slow" ๋๋ "PyInstaller large exe" ๊ฐ์ ํค์๋๋ก ๊ตฌ๊ธ๋งํด์, ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๋ค ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ํ์ ์ป์ด๋ณด์ธ์.
- ์ค๊ธฐ ํ๋ก์ ํธ (1~4์ฃผ ์์ ์๋ํด๋ณผ ๋งํ ๊ฒ):
- ๊ธฐ์กด์ย
--onefile
๋ก ๋ง๋ค์ด์ ๋ต๋ตํ๋ ํ๋ก์ ํธ ํ๋๋ฅผ ๊ณจ๋ผ์,ย--onedir
๋ก ๋ณ๊ฒฝํ๊ณ ,ย.spec
ย ํ์ผ์ ์ง์ ์์ ํด๊ฐ๋ฉด์ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋๋ค์ ํ๋์ฉยexcludes
์ ์ถ๊ฐํด๋ณด์ธ์. ํด๋ ํฌ๊ธฐ๊ฐ ์ผ๋ง๋ ์ค์ด๋๋์ง, ์คํ์ ์ ๋๋์ง ๊ผผ๊ผผํ ํ ์คํธํ๋ฉด์ "๋๋ง์ ์ต์ ํ ๋ ์ํผ"๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฑฐ์ฃ . - UPX (Ultimate Packer for eXecutables)๋ผ๋ ์คํ ํ์ผ ์์ถ ๋๊ตฌ๋ฅผ ์ค์นํ๊ณ , PyInstaller์ย
--upx-dir
ย ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํด์ย--onedir
๋ก ๋ง๋ ๊ฒฐ๊ณผ๋ฌผ ํด๋ ์์ ์คํ ํ์ผ์ด๋ DLL ํ์ผ๋ค์ ํฌ๊ธฐ๋ฅผ ๋ ์ค์ฌ๋ณด๋ ์คํ์ ํด๋ณด์ธ์. (์ฃผ์: UPX๋ ๊ฐ๋ ์ค์๋ํ๊ฑฐ๋ ์ํฐ๋ฐ์ด๋ฌ์ค์ ๊ฑธ๋ฆด ์ ์์ผ๋ ํ ์คํธ ํ์!) - ์๋ จ๋ ์ ๊ฒ:
- ์ปดํจํฐ ์ ๋ชจ๋ฅด๋ ์น๊ตฌ์๊ฒ "์ ๋ด๊ฐ ๋ง๋ ํ์ด์ฌ ํ๋ก๊ทธ๋จ ์คํ ํ์ผ์ด ์ด๋ ๊ฒ ํด๊น?"๋ผ๋ ์ง๋ฌธ์ ๋ฐ์์ ๋,ย
--onefile
๊ณผย--onedir
์ ์ฐจ์ด์ ์ ์ผ์์ ์ธ ๋น์ (์ด์ฌ, ์บ ํ ๋ฑ)๋ฅผ ๋ค์ด 5๋ถ ์์ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ์ค๋ช ํด์ค ์ ์๋์? - PyInstaller๋ก ๋น๋ํ๋ค๊ฐ ๋นจ๊ฐ์ ์๋ฌ ๋ฉ์์ง๊ฐ ์๋ฉ ๋ด์ ๋, ๋นํฉํ์ง ์๊ณ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ฐจ๋ถํ ์ฝ์ด๋ณด๋ฉด์ "์, ์ด๊ฑด ์๋ง๋ XXX ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก ๋ฌธ์ ์ผ ๊ฑฐ์ผ" ๋๋ "์จ๊ฒจ์ง ์์กด์ฑ์ ๋ชป ์ฐพ์๋ ๋ณด๋ค" ๊ฐ์ด ๋๋ต์ ์ธ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉํฅ์ ์ง์ํ ์ ์๋์?
- ์๋ก์ด ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋, "์, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ GUI ๊ธฐ๋ฅ์ด ๋ง๊ณ , ์์ฒด ๋ฐ์ดํฐ ํ์ผ๋ ์ข ์๋ ๊ฒ ๊ฐ์ผ๋ PyInstaller๋ก ๋ฌถ์ผ๋ฉด ๊ฝค ์ปค์ง๊ฒ ๊ตฐ" ํ๊ณ ๋ฏธ๋ฆฌ ์์ํด๋ณผ ์ ์๋์?
- ์ถ๊ฐ ๋ฆฌ์์ค (๋์ ๋ ๋งํ ๊ณณ):
- ๊ฐ์ฅ ๊ธฐ๋ณธ & ์ค์:
- PyInstaller ๊ณต์ ๋ฌธ์:ย https://pyinstaller.readthedocs.io/ย (ํนํ "Usage", "Options", "When Things Go Wrong" ์น์ )
- ์ฝ๊ฒ ๋ฐ๋ผ ํ๊ธฐ ์ข์ ๊ณณ (์ด๊ธ ~ ์ค๊ธ):
- ์ ํ๋ธ ๊ฒ์: "ํ์ด์ฌ exe ๋ง๋ค๊ธฐ PyInstaller", "PyInstaller ํ์ผ ํฌ๊ธฐ ์ค์ด๊ธฐ", "Python to EXE tutorial"
- ๊ตญ๋ด์ธ ํ์ด์ฌ ๊ด๋ จ ๋ธ๋ก๊ทธ๋ ์ปค๋ฎค๋ํฐ (์: Stack Overflow, ์ํ์ฝ๋ฉ, AskDjango ๋ฑ)์ PyInstaller ๊ด๋ จ ๊ธ๋ค
- ์ข ๋ ๊น์ด ์๊ณ ์ถ์ ๋ (์ค๊ธ ~ ๊ณ ๊ธ):
auto-py-to-exe
ย (PyInstaller๋ฅผ GUI๋ก ์ฝ๊ฒ ์ฐ๊ฒ ํด์ฃผ๋ ๋๊ตฌ): ์ด๋ค ์ต์ ๋ค์ด ์๋์ง ๊ตฌ๊ฒฝํ๊ธฐ ์ข์์.ย https://pypi.org/project/auto-py-to-exe/- Nuitka (๋ ๋ค๋ฅธ ํ์ด์ฌ ์ปดํ์ผ๋ฌ/ํจํค์ง ๋๊ตฌ): PyInstaller์ ๋น๊ตํด๋ณด๋ฉฐ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ด์.ย https://nuitka.net/
๐ ์ง์ ์์ถ ์์ฝ
- ํ์ด์ฌ ์คํ ํ์ผ(EXE)์ ๋จ์ํ ์ฝ๋ ๋ณต์ฌ๋ณธ์ด ์๋๋ผ, ํ์ด์ฌ ํด์๊ธฐ, ์ฌ์ฉํ ๋ชจ๋ ๋๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๊น์ง ๋ด์ '์์ง์ด๋ ์์ ํ์ด์ฌ ํ๊ฒฝ'์ด๋ผ์ ์๊ฐ๋ณด๋ค ํด ์๋ฐ์ ์์ด์.
- ํ์ผ ํ๋๋ก ๊น๋ํ๊ฒ ๋ง๋๋ย
--onefile
ย ์ต์ ์ ํธ๋ฆฌํด ๋ณด์ด์ง๋ง, ๋ชจ๋ ์ง์ ํ ๊ฐ๋ฐฉ์ ์ต์ง๋ก ์ค์ ๋ฃ๋ ๊ฑฐ๋ผ ํจ์ฌ ๋ ํฌ๊ณ , ๋๋ฆฌ๊ณ , ๋ง๋๋ ๋ฐ๋ ์ค๋ ๊ฑธ๋ ค์. ์ฌ๋งํ๋ฉดย--onedir
(ํด๋์งธ ๋ง๋ค๊ธฐ) ์ต์ ์ด ๋น๋๋ ๋น ๋ฅด๊ณ , ์คํ๋ ๋น ๋ฅด๊ณ , ์ต์ข ์ฉ๋ ๊ด๋ฆฌ๋ ์ ๋ฆฌํด์. - ์์ ์์ ์ ์ ๊นจ๋ํ '๋๋ง์ ๋ฐฉ'(๊ฐ์ํ๊ฒฝ)์ ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์ ๊ผญ ํ์ํ ๋๊ตฌ๋ง ๋๋ ์ต๊ด์ ๋ค์ด๋ฉด, ๋์ค์ ์คํ ํ์ผ ๋ง๋ค ๋ ๋ถํ์ํ ์ง์ด ์ค์ด๋ค์ด ํจ์ฌ ๊ฐ๋ฒผ์์ง ์ ์์ด์.
- ๊ฐ๋์ ์ด๋ค ๋๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๊ฐ ์จ๊ฒจ์ง '์น๊ตฌ์ ์น๊ตฌ'(์์กด์ฑ)๊น์ง ๋ค ๋ฐ๋ ค์์ ํ์ผ์ด ์ปค์ง๋์ง ์ดํด๋ณด๋ ํ์ ๋์ด๋ ํ์ํด์!
์ด ์ฒญ์ฌ์ง์ด ๋ณต์กํ๊ฒ๋ง ๋๊ปด์ก๋ ํ์ด์ฌ ์คํ ํ์ผ ๋น๋์ ์ธ๊ณ๋ฅผ ์ดํดํ๊ณ , ์์ผ๋ก ๋ ํจ์จ์ ์ผ๋ก ์์ ํ์๋ ๋ฐ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค! ํต์ฌ์ "์ ๊ทธ๋ฐ์ง" ์ด์ ๋ฅผ ์๊ณ , ์ํฉ์ ๋ง๋ "์ต์ ์ ๋๊ตฌ์ ๋ฐฉ๋ฒ"์ ์ ํํ๋ ๊ฑฐ์์.
๋๊ธ
๋๊ธ ๋ก๋ฉ ์ค...