[PyQt] 디스플레이가 없을 때 PyQt 프로그램 실행 (+ 부팅시 자동실행)

이정찬·2022년 5월 25일
0

PyQt

목록 보기
6/6
post-thumbnail

2021년 8월부터 2021년 11월까지 진행된 PyQt를 이용한 스마트팩토리 외주에서 배운 사항들을 정리하기 위해 작성한 글입니다.
Raspberry Pi 3 환경에 Raspbian OS를 설치하여 진행하였습니다.

해당 외주의 요구사항 중, 디스플레이 모니터가 없는 Raspberry Pi 보드에서도 프로그램이 실행되어야 하는 부분이 있었습니다. 디스플레이 모니터가 있는 기기와 동일한 shell script 코드로 진행하려고 했지만, 제대로 실행되지 않았습니다.

알아보니, GUI 화면이 뜨지 않고 PyQt의 기능만을 이용하는 방법이 있었습니다. 이 포스팅에서는 그 방법과, 부팅 시 python 프로그램을 자동실행하는 방법에 대하여 포스팅 할 예정입니다.

1. QCoreApplication 사용

QCoreApplicationQtCore의 내부 모듈입니다. 보통의 PyQt 파일이라면, 아래와 같이 main 함수에 QtWidgets 내부의 QApplication 모듈을 이용합니다.

### mainUI.py
class MainUI(QtWidgets.QMainWindow):
	...
    
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main = MainUI()
    main.show()
    sys.exit(app.exec_())

이런 식으로 말이죠. 이렇게 하면 mainUI.py라는 파일을 실행시켰을때, MainUI() 객체가 가진 모든 함수들이 실행되게 되고, 구성된 GUI가 화면에 뜨게 됩니다.

그러나, 이러한 실행방식은 GUI가 뜰 창이 없다면, 에러를 발생시키며 프로그램이 종료되고 아무것도 기능하지 않습니다.

이런 문제를 해결하기 위해 우리는 QtWidgets.QApplication 모듈이 아닌, QtCore.QCoreApplication 모듈을 사용합니다.

### retainProcess.py
class RetainProcess():
	...
    
if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    main = RetainProcess()
    sys.exit(app.exec_())

GUI를 보일 화면이 없기 때문에, show()함수를 사용하지 않는다는 것을 제외하면, QtWidgets.QApplicationQtCore.QCoreApplication으로 바꿔주면 이제 디스플레이가 없는 환경에서도 PyQt를 정상적으로 실행시킬 수 있습니다.

2. 부팅시 자동실행

그러나, 저렇게 코드를 작성해놓아도 디스플레이가 없다면 아예 실행을 시킬 수 없습니다. 기기 전원이 켜지면 자동으로 저 기능이 실행되어야 합니다.

shell script를 하나 만들어서 거기에 파일 실행 코드를 넣어주고, 그 sh 파일을 자동실행 하는 방식으로 부팅시 자동실행을 구현할 수 있습니다.

#!/bin/bash
python3 /home/pi/pyqt_work/retainProcess.py
read reply

위와 같이 .sh 확장자의 파일을 만듭니다. 저 같은 경우는 retain_script.sh로 작성하였습니다. 둘쨰줄에 실행 하고자 하는 파일을 실행시키는 명령어를 다른 명령어로 바꾼다면 비단 python 뿐만 아니라 다른 프로그램에도 적용이 가능합니다.

이 sh파일에는 현재 실행권한이 없기 때문에, sudo(관리자) 유저에게 이 파일의 실행권한을 줍니다.

sudo chmod +x retain_script.sh

이렇게 만들어진 shell script를 프로그램이 켜질 때 자동실행을 시켜주면 됩니다.

Raspbian을 기준으로 작성하였습니다.

아주 간단합니다. 먼저, 특정 파일을 편집기를 사용하여 열어줍니다.

sudo nano /etc/xdg/lxsession/LXDE-pi/autostart

이 파일을 열면, 이미 작성되어 있는 글이 여러 줄 나오게 됩니다. 그 줄 맨 마지막에 lxtermianl -e /home/pi/pyqt_work/retain_script.sh 라고 입력해 주면 제가 만들어둔 retain_script.sh가 부팅시 자동으로 실행되게 됩니다. 다른 경로의 다른 파일이라면 -e 다음 부분만 수정해서 이용할 수 있습니다.

3. 마치며

생각보다 많은 시간을 소요했던 부분입니다. 당연히 실행될 것이라고 생각했지만, 디스플레이 모니터가 없는 기기에서 테스트를 진행할 때 문제가 생긴다는 것을 뒤늦게 알아차렸습니다.

그러나 다른 모듈을 사용할 생각을 아예 하지 못한 채, 어떻게든 예외처리로 해결하려고 했었습니다. 뒤늦게 그런 기능을 제공하는 모듈이 있다는 걸 알아서 다행히 해결할 수 있었습니다. 역시 개발을 할 때는 테스트를 철저하게 진행해야 한다는 것을 다시 한번 깨달을 수 있었던 개발이었습니다.

profile
개발자를 꿈꾸는 사람

0개의 댓글