python을 모르는 사람에게 python으로 만든 코드를 전달할 일이 생겼다. 바로 실행할 수 있도록 실행파일을 만들어보내기로 했다. 덕분에 이것 조사하고, pySide를 공부하기 시작했다. 다음은 pySide와 QT를 이용하여 실행파일을 만들면서 그 과정을 기록한 내용이다. 먼저 pySide6를 이용하여 간단한 사용자 인터페이스를 만들고, 이를 실행파일로 만들어 배포하는 과정을 설명한다.
pySide6
Python과 QT 를 바인딩하여 python으로 GUI 프로그램을 가능하게 만들어주는 패키지이다. Python과 QT의 바인딩에는 pyQT와 pySide가 가장 유명하고, pyQT가 먼저 출시되어 많이 사용되어왔다. pySide는 QT에서 공식적으로 출시한 패키지이며, pyQT와 유사하다. pyQT가 GPL과 유료 상용 라이센스를 제공하는데 반해 pySide는 LGPL 라이선스를 지원하기 때문에 pySide 패키지를 수정하지 않고 그대로 사용할 경우에는 소스를 공개할 필요가 없는 장점이 있다.
pySide6의 설치
일반적인 python 패키지 설치와 유사하게 pip를 사용하여 설치할 수 있다.
pip install pyside6
pySide6 예제 실행
pySide6는 QT for Python이라는 홈페이지를 이용하면 사용법을 익힐 수 있다. 다음은 Qt for Python 사이트에서 제공하는 첫 번째 tutorial 파일이다.
import sys
from PySide6.QtWidgets import QApplication, Qlabel
app = QApplication(sys.argv)
label = QLabel("Hello World!")
label.show()
app.exec()
https://doc.qt.io/qtforpython-6/tutorials/basictutorial/widgets.html#tutorial-widgets
Your First QtWidgets Application - Qt for Python
Previous Tutorials
doc.qt.io
각 코드는 다음과 같은 의미를 갖는다.
app = QApplication(sys.argv)
QApplication을 이용하여 application object인 Qapplication object를 생성한다. 가로안의 sys.argv는 QT가 command line에서 인수(argument)를 받을 수 있어, 이를 전달하기 위해 추가되었다.
label = QLabel("Hello World!")
Application 생성 후, text를 표시해줄 Qlabel object를 생성하였다. Text 객체가 생성되면 show() method를 호출하여 표시를 할 수 있다.
label.show()
마지막으로 Qapplication을 시작하기 위해 exec() method를 호출한다.
app.exec()
exec()를 실행하면, QT main loop로 진입하여, QT code를 실행한다. 즉 작성한 GUI가 별도로 종료하기 전까지는 계속 작동하게 된다.
실행을 하면 그림과 같은 작은 창이 만들어진다.

이제 실행파일로 GUI 프로그램을 제작할 수 있는지 확인하기 위해 pySide 예제를 실행파일 제작하는 과정을 진행하겠다.
pySide 예제를 독립적으로 실행하는 배포판으로 만들기
Python코드는 command 창에서 실행하거나, colab/jupiter notebook 등에서 실행시키는 경우가 많다. 그러나 QT와 같은 GUI와 함께라면 별도 창을 열어 실행하는 독립적인 application 형태로 만들어 사용하거나 배포할 수 있다. 본 문서에서는 가장 간단한 형태를 이를 구현하는 방법을 설명하고자 한다.
https://doc.qt.io/qtforpython-6/deployment/deployment-pyside6-deploy.html
pyside6-deploy: the deployment tool for Qt for Python - Qt for Python
Previous Deployment
doc.qt.io
Python 의 main entry point 를 이용하는 방식
if __name__ == "__main__":
Python에서 사용하는 __name__ == "__main__" 는 실행할 시작점을 표시한다. 이를 이용하면 간단하게 배포판을 만들 수 있다. 앞서 사용한 예제를 수정한 자료는 다음과 같다.
import sys
from PySide6.QtWidgets import QApplication, QLabel
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("Hello World!")
label.show()
app.exec()
app=Qapplication(sys.argv) 부터 app.exec() 까지를 if __name__=="__main__": 아래 넣었다.
예제 파일을 저장하고, pyside6-deploy를 실행하여 배포판을 생성한다. 예제 파일을 pyside_test.py라고 저장 했다면, Command line에서 다음을 입력하여 배포판을 생성한다.
pyside6-deploy는 pyside6를 설치할 때 함께 설치되기 때문에 앞서 설명한 pyside6 설치 과정을 거쳤다면 설치되어 있을 것이다.
pyside6-deploy pyside_test.py
실행하면, 가상환경을 사용하지 않을 경우 다음과 같은 message를 볼수 있다.
You are not using a virtual environment. pyside6-deploy needs to install a
few Python packages for deployment to work seamlessly.
Proceed? [Y/n]
Y를 누르면 생성되어, pyside_test.exe 라는 실행파일이 작업 했던 폴더에 생성되었음을 확인할 수 있다. Command line에서 실행하거나, window 탐색기에서 pyside_example01.exe를 더블클릭하여 실행할 수 있다.
pysidedeploy.spec 을 사용하는 방법
pyside6-deploy를 처음 실행시키면 pysidedeploy.spec 파일이 생성된다. Pysidedeploy.spec은 실행파일을 생성할 때 사용할 수 있는 다양한 parameter가 정리되어 있어, 옵션을 조정할 수 있다. pysidedeploy.spec 파일이 생성되었다면 다음과 같은 명령으로 배포를 위한 실행파일을 만들 수 있다.
pyside6-deploy pysidedeploy.spec
생성되는 결과는 main entry point 를 이용하는 방식과 같이 pyside_test.exe 가 만들어진다.
pysidedeploy.spec의 중요한 파일 내용
[app]
title : 어플리케이션 이름
project_dir : project folder 이름
input_file : 어플리케이션을 만든 main python entry point가 있는 python 파일
exec_directory : 실행파일이 생성되는 folder 이름
icon : 어플리케이션에 사용할 icon
[python]
python_path : 사용할 python 경로
package : 어플리케이션 생성에 함께 사용할 python 패키지
[qt]
qml_files : 실행파일과 함께 묶일 QML 파일 경로
실제로 생성된 파일의 예
[app]
# title of your application
title = pyside_app_demo
# project directory. the general assumption is that project_dir is the parent directory
# of input_file
project_dir = .
# source file path
input_file = C:\02.Project\09_side\side\sideTest.py
# directory where exec is stored
exec_directory = .
# path to .pyproject project file
project_file =
# application icon
icon = C:\python38\Lib\site-packages\PySide6\scripts\deploy_lib\pyside_icon.ico
[python]
# python path
python_path = C:\Python38\python.exe
# python packages to install
# ordered-set = increase compile time performance of nuitka packaging
# zstandard = provides final executable size optimization
packages = nuitka==1.8.0,ordered_set,zstandard
# buildozer = for deploying Android application
android_packages = buildozer==1.5.0,cython==0.29.33
[qt]
# comma separated path to qml files required
# normally all the qml files required by the project are added automatically
qml_files =
# excluded qml plugin binaries
excluded_qml_plugins =
[android]
# path to pyside wheel
wheel_pyside =
# path to shiboken wheel
wheel_shiboken =
# plugins to be copied to libs folder of the packaged application. comma separated
plugins = platforms_qtforandroid
[nuitka]
# (str) specify any extra nuitka arguments
# eg = extra_args = --show-modules --follow-stdlib
extra_args = --quiet --noinclude-qt-translations
[buildozer]
# build mode
# possible options = [release, debug]
# release creates an aab, while debug creates an apk
mode = debug
# contrains path to pyside6 and shiboken6 recipe dir
recipe_dir =
# path to extra qt android jars to be loaded by the application
jars_dir =
# if empty uses default ndk path downloaded by buildozer
ndk_path =
# if empty uses default sdk path downloaded by buildozer
sdk_path =
# modules used. comma separated
modules =
# other libraries to be loaded. comma separated.
# loaded at app startup
local_libs = plugins_platforms_qtforandroid
# architecture of deployed platform
# possible values = ["aarch64", "armv7a", "i686", "x86_64"]
arch =

'Python' 카테고리의 다른 글
| [Python] python을 이용한 QR code 만들기 (3) | 2025.02.04 |
|---|