본문 바로가기
에러 해결

SetProcessDpiAwarenessContext failed 에러

by Devry 2023. 7. 27.

🛠환경

윈도우 10 최신
파이썬 3.11
Pyside6  6.4.2
PyAutoGUI 0.9.54
pyinstaller 5.13.0

상황

Pyside6 GUI 구현 후, Pyinsatller로 빌드 한 프로그램의 콘솔에 에러 메시지가 출력됐습니다.(작동엔 이상 없음)

빌드 후 CLI에 출력된 에러

원인 분석

  1. 액세스 거부와 관련해서 ChatGPT는 관리자 권한으로 실행하라 했지만 해결되지 않았습니다.
  2. SetProcessDpiAwarenessContext 관련해서 ChatGPT는 화면을 그리는 과정에 해상도 설정 문제라고 합니다. 이상한 점은 기본적인 위젯만 사용한 애플리케이션이고 해상도 관련해서 설정은 건든 부분이 없다는 점입니다. 해결책으로 제시된 processDPI 설정 메서드를 사용해도 해결되지 않았습니다.
  3. 소스코드로 실행 시에는 발생하지 않고 Pyinstaller로 빌드 후 나타나는 점에서, Pyinstaller와의 호환성이 다른 라이브러리와 충돌이 있는게 아닌가 생각했지만, 새로운 프로젝트를 생성 후 Pyinstaller로 빌드하면 발생하지 않았습니다.

 

결과적으로 화면 해상도와 관련해서 사용한 라이브러리 중에 어떤 영향에 의해, 빌드 시에 충돌이 일어나서 문제가 나타난다라는 점입니다.

 

 

🔑해결

검색하는 방법으로는 그닥 큰 에러가 아니어서인지 글을 찾기 힘들었고, 제가 해결한 방법은

새로운 프로젝트를 생성해서 "라이브러리 하나 복붙 => Pyinstaller로 빌드 => 에러 확인" 과정을 의심되는 라이브러리부터 반복 수행을 했습니다(디지털 노가다). 프로젝트의 규모가 큰 경우는 반대로 하나씩 지워가는 방식이 나을 수도 있을 것 같네요

 

원인은 PyAutoGUI라는 마우스, 키보드 입력 자동화 관련 라이브러리 였는데, 저는 알림 메시지 용으로 사용했었습니다.

 

PyAutoGUi 알림 메시지

pyautogui의 alert()라는 메서드로 중간에 작업을 멈추고 메시지를 띄웠는데, 사실 Pyside를 사용하면 QMessageBox가 있기 때문에 필요 없었지만, QMessageBox는 메서드로 구현해서 사용해야 하고 기존에 구현된 걸 바꾸기에 노력이 들기 때문에 하던 대로 사용하고 있었습니다.

 

def showMessageBox(self, title, text):
    # QMessageBox 생성
    msg_box = QMessageBox()
    msg_box.setIcon(QMessageBox.Information)
    msg_box.setWindowTitle(title)
    msg_box.setText(text)
    msg_box.setStandardButtons(QMessageBox.Ok)

    # 메시지 박스 표시
    msg_box.exec()

지금은 다음과 같이 메서드를 구현 후 사용하여 해결을 했습니다.

PyAutoGUI와 Pyinstaller 빌드를 같이 사용 했을때 왜 발생하는지 알고 계신 분 공유해 주시면 감사하겠습니다!

 

 

 

댓글