Search
moon
sun

Pyinstaller 이용해서 exe파일

Tags
Date
2024/09/27
URL

🐣: Pyinstaller 이해하기

🧑‍🏫
하나의 .py 파일을 .exe 파일로 만들려면 Pyinstaller .\main.py라고 하면 되고,
⇒ 여기서는 내가 .exe로 만들고 싶은 파일이 main.py가 되는 것임.
그러면 2개의 폴더와 1개의 파일이 생성될 것이다.
⇒ dist 폴더, build 폴더, main.spec 파일이 생성됨
여기서 dist 폴더가 우리에게 필요하다.
해당 강의에서는 pyinstaller .\practice.py를 실행해서 practice.exe가 생성됨
그런데 여기서 중요한 점은 dist 폴더에 main.exe가 생성되었음을 확인할 수 있다.
그런데 main.exe를 실행하려면, dist 폴더 내의 모든 파일이 존재해야 실행할 수 있다.
👱‍♂️
그렇다면, 저는 main.exe파일만 배포하고 싶은데,
위의 방식을 사용하면 dist 폴더 내의 파일을 압축해서 공유해야 하는군요.
dist 폴더를 공유하지 않고 main.exe 파일만 배포해도 문제없이 실행되는 방법은 없나요?
🧑‍🏫
이런 경우에는 pyinstaller -F .\main.py 혹은 pyinstaller --onefile .\main.py
🥲
pyinstaller — onefile app.py를 실행하면, 아래와 같은 오류가 발생함
The ‘pathlib’ package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (C:\Users\anaconda3\Lib\site-packages) using conda remove then try agian.
👱‍♂️
이 오류 코드에 대해 자세히 설명해줄래?
🤖
pathlib 패키지가 더 이상 필요하지 않거나, Python의 표준 라이브러리에 이미 포함되어 있기 때문에 충돌이 발생한다는 의미입니다. PyInstaller는 Python 애플리케이션을 배포 가능한 실행 파일로 변환하는 도구인데,
pathlib의 불필요한 버전이 포함되어 있으면 작동에 문제가 생길 수 있습니다.
즉, Anaconda 환경에서 pathlib의 배개포트 버전이 설치되어 있을 경우, PyInstaller와의 호환성 문제가 발생할 수 있습니다.
<해결 방법>
Anaconda Prompt에서 pathlib 패키지를 제거
conda remove pathlib
👱‍♂️
내가 궁금한 점은 conda remove pathlib를 하면 PyInstaller를 사용하려는 프로젝트는 상관없으나
다른 프로젝트에서 문제가 생길 수 있지 않을까?
🤖
아, 그 점에 대해 걱정하시는군요! 일반적으로 conda remove pathlib를 통해 제거하는 것은 pathlib의 백포트 버전만 제거하는 것이며, 표준 라이브러리의 pathlib는 영향을 받지 않습니다. 따라서 Python 3.4 이상을 사용하고 있다면 문제없이 사용할 수 있습니다.

🐣: 문제점

참고용
📝
pyinstaller --onefile app.py를 실행시키면 아래와 같은 오류 메시지가 출력된다.
The 'pathlib' package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (located in C:\Users\sook3\anaconda3\Lib\site-packages) using conda remove then try again.
pip uninstall pathlib
그랬더니 아래와 같은 오류 메시지가 출력됨
그랬더니 Python 3.4 이상 버전은 백포트 패키지가 필요하지 않아 백포트 패키지들이 오히려 충돌을 일으킬 수 있기 때문에 제거하라고 권장함
⇒ pathlib, enum34, typing
pip uninstall pathlib 실행 후, pyinstaller --onefile app.py를 실행함
그랬더니 아래와 같은 오류가 발생함
Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Users\sook3\anaconda3\Scripts\pyinstaller.exe\main.py", line 7, in <module> File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\main.py", line 231, in _console_script_run run() File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\main.py", line 172, in run parser = generate_parser() ^^^^^^^^^^^^^^^^^ File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\main.py", line 137, in generate_parser import PyInstaller.building.build_main File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\building\build_main.py", line 28, in <module> from PyInstaller.building.api import COLLECT, EXE, MERGE, PYZ File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\building\api.py", line 33, in <module> from PyInstaller.building.splash import Splash # argument type validation in EXE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\building\splash.py", line 23, in <module> from PyInstaller.depend import bindepend File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\depend\bindepend.py", line 25, in <module> from PyInstaller.depend import dylib, utils File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\depend\utils.py", line 31, in <module> from PyInstaller.lib.modulegraph import modulegraph File "C:\Users\sook3\anaconda3\Lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 34, in <module> from altgraph.ObjectGraph import ObjectGraph File "C:\Users\sook3\anaconda3\Lib\site-packages\altgraph\init.py", line 142, in <module> import pkg_resources File "C:\Users\sook3\anaconda3\Lib\site-packages\pkg_resources\init.py", line 95, in <module> from jaraco.text import drop_comment, join_continuation, yield_lines File "C:\Users\sook3\anaconda3\Lib\site-packages\setuptools\_vendor\jaraco\text\init.py", line 12, in <module> from jaraco.context import ExceptionTrap File "C:\Users\sook3\anaconda3\Lib\site-packages\setuptools\_vendor\jaraco\context.py", line 17, in <module> from backports import tarfile ImportError: cannot import name 'tarfile' from 'backports' (C:\Users\sook3\anaconda3\Lib\site-packages\backports\init.py)
pip uninstall backports
WARNING: Ignoring invalid distribution ~upyterlab (C:\Users\sook3\anaconda3\Lib\site-packages) WARNING: Skipping backports as it is not installed.
pip install -- upgrade setuptools
pip install -- upgrade jaraco.context jaraco.text
pip install backports.tarfile
📝
<subprocess.Popen 문제점>
실행하면, print문을 터미널에서 확인할 수 없는 문제점이 존재함.
→ 결국에 powershell이 아닌 cmd로 실행해야 확인할 수 있음
import subprocess import os def run_app_exe(): #subprocess.Popen : 새로운 프로세스를 생성하는데 부모 프로세스와 자식 프로세스가 병렬 실행 def run_app_exe(): subprocess.Popen(["cmd","/k","app.exe"], shell=True) def run_application_exe(): subprocess.Popen(["application.exe"],shell=False) if __name__ == "__main__": # 실행 파일들이 있는 디렉터리로 이동 exe_directory = "C:\\Users\\sook3\\OneDrive\\바탕 화면\\something\\학습\\DEL 과제\\국립재활연구원_2408\\chatbot 만들기\\Project\\dist" os.chdir(exe_directory) # 서버 역할을 하는 app.exe 먼저 실행 run_app_exe() # GUI Application 역할을 하는 application.exe 실행 run_application_exe()
Python
복사
🥲
바탕화면에서 터미널을 열거나, ‘.exe’파일을 실행하면 cmd가 아닌 powershell로 실행된다.
여기다가 PyInstaller는 여러 개의 .py들을 하나의 패키지를 만들어주는 역할을 하는데,
app.exe와 application.exe를 한 번에 묶어 main.exe로 실행하려는 노력은 불가능했다.
⇒ main.exe로 실행하면 app.exe는 종료되어 버린다.
해당 결과 파일은 Google Drive에 공유하기!