GIS

QGIS: 'SAGA 7.8.2 버전을 공식적으로 지원하지 않습니다' 비활성화

유병혁 2022. 1. 15. 13:51

안녕하세요? 최근에 QGIS 3.22.2 버전을 설치하고 나서 SAGA 툴박스에서 다음과 같은 경고 메시지를 경험했습니다. 해당 내용을 QGIS 깃허브에 제보(https://github.com/qgis/QGIS/issues/46837)하고 여러 감사한 답변들을 받았는데요, 이중 경고 메시지를 비활성화할 수 있는 방법 하나를 정리해 보고자 합니다.

 

Warning message: SAGA version 7.8.2 is not officially supported - algorithms may encounter issues · Issue #46837 · qgis/QGIS

What is the bug or the crash? I'm using both QGIS 3.16.14 and QGIS 3.22.2. Whenever I run the SAGA tool, I get the following warning message: SAGA version 7.8.2 is not officially supported - al...

github.com

방법은 간단한데요, 경고 메시지를 표시하는 해당 소스코드를 주석 처리하는 것입니다.

Andrea Giudiceandrea(안드레아 주디체안드레아) 님이 해당 코드의 위치를 알려주셨습니다!

'C:\Program Files\QGIS 3.22.2\apps\qgis\python\plugins\sagaprovider' 폴더에서 'SagaAlgorithmProvider.py'를 수정합니다. *Permission denied 시 해당 파일을 (D:)에 복사해서 작업 후 붙여넣기 하시면 편리합니다.

아래 warningMessage(self) 함수를 탐색한 후,

관련 소스코드 3줄을 아래와 같이 주석 표시하시면 됩니다. 간단하죠?!

이제 경고 메시지가 표출되지 않습니다. 차기 버전에서 조치가 있지 않을까 기대해 봅니다.

IndentationError: expected an indented block 오류 시 체크사항

SagaAlgorithmProvider.py 내부는 아래와 같은 클래스(class)로 정의된 상태입니다.

class SagaAlgorithmProvider():
    def __init__(self):
        oldSAGA = False
    def warningMessage(self):
        if self.oldSAGA:
            print("Hello, warning!")
        return ''
# SagaAlgorithmProvider 클래스 객체
warningT = SagaAlgorithmProvider()
warningT.oldSAGA = True; warningT.warningMessage()

위 코드를 실행하면 아래와 같은 출력결과를 얻을 수 있는데요, 여기서 'Hello, warning!'만 삭제하는 것이 우리가 해주는 주석 처리입니다.

Hello, warning!
''

해당되는 소스코드만 주석 처리한다면 원하는 결과값을 얻을 수 있습니다. 아래는 주석 처리과정에서 경험할 수 있는 오류 유형 2가지를 정리해 봤습니다.

class SagaAlgorithmProvider():
    def __init__(self):
        oldSAGA = False
    def warningMessage(self):
        # if self.oldSAGA:
        #     print("Hello, warning!")
        return ''
# SagaAlgorithmProvider 클래스 객체
warningT = SagaAlgorithmProvider()
warningT.oldSAGA = True; warningT.warningMessage()
''

(오류1) 클래스 함수에서 return ''까지 주석처리할 경우 아래 'IndentationError(들여쓰기 오류)'를 경험하실 수 있습니다. 실제로는 들여쓰기 문제가 아니기 때문에 오히려 헷갈리실 수 있습니다.

class SagaAlgorithmProvider():
    def __init__(self):
        oldSAGA = False
    def warningMessage(self):
        # if self.oldSAGA:
        #     print("Hello, warning!")
        # return ''
# SagaAlgorithmProvider 클래스 객체
warningT = SagaAlgorithmProvider()
warningT.oldSAGA = True; warningT.warningMessage()
  Input In [3]
    warningT = SagaAlgorithmProvider()
                                      ^
IndentationError: expected an indented block

(오류2) 아래와 같이 주석 들여쓰기를 안한 경우에도 'IndentationError(들여쓰기 오류)'가 발생됩니다. 이런 경우, 일반 소스코드와 동일하게 주석에서도 들여쓰기를 적용해 주시면 됩니다.

class SagaAlgorithmProvider():
    def __init__(self):
        oldSAGA = False
    def warningMessage(self):
'''
        if self.oldSAGA:
            print("Hello, warning!")
'''
        return ''
# SagaAlgorithmProvider 클래스 객체
warningT = SagaAlgorithmProvider()
warningT.oldSAGA = True; warningT.warningMessage()
  Input In [4]
    '''
       ^
IndentationError: expected an indented block

아래 화면은 제가 의도적으로 'IndentationError'를 발생시켜본 것입니다. 아래 화면을 접하시더라도 당황하지 마시고 내가 주석을 필요한 부분만 적용했는지, 문법에 맞게 처리했는지, 다시 한 번 체크해보시면 좋겠습니다.