PYTHON 한글자동화

[ 한글 자동화 ] 한글 프로그램 실행하기, Dispatch vs gencache.EnsureDispatch

나루하루001 2025. 5. 10. 01:02
반응형

 들 어 가 며

 
이번 블로그에서는 파이썬을 사용해 한글(HWP) 프로그램을 실행하는 방법
파이썬으로 한글 문서를 자동화할 때 자주 사용하는 두 가지 방법,

win32.Dispatchwin32.gencache.EnsureDispatch의 차이점에 대해 알아보겠습니다.

 
 

 준 비 하 기

 
먼저 파이썬 패키지를 하나 설치합니다.
 
설치할 패키지pywin32이며,
COM객체를 조작해 한글뿐만 아니라 엑셀 등 다양한 윈도우 프로그램을 조작하고 다룰 수 있게 해주는 패키지입니다.
 
먼저 VSCode를 실행하고 터미널에서 아래 명령을 실행합니다.

pip install pywin32

 
※ pip 명령에 대한 설명 : 파이썬(Python) 패키지 설치하기, Pip 명령의 기본 사용법
 
 

 한글 프로그램 실행하기

 

1) 첫번째 방법

 
pywin32 패키지를 설치했으면 
다음과 같이 코드를 작성하고 실행하면 한글 프로그램이 실행됩니다.

import win32com.client as win32

hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Active_XHwpWindow.Visible = True

 
위 코드를 먼저 한 줄씩 살펴보겠습니다.

import win32com.client as win32

 
 
이 코드는 pywin32 패키지의 일부인 win32com.client 모듈을 가지고 와
win32라는 별칭으로 사용하겠다는 의미입니다.
 
win32com.client는 윈도우의 COM 인터페이스를
파이썬에서 사용할 수 있게 해주는 모듈입니다.
 
우선 이렇게 win32com.client 모듈을 불러와야
윈도우 프로그램을 조작할 수 있다고 알아두시면 됩니다.
 

hwp = win32.Dispatch("HWPFrame.HwpObject")

 
이 코드가 실행되면 한글 프로그램이 실행되며,
hwp라는 변수를 통해 한글 프로그램을 조작할 수 있게 됩니다.
 
하지만 백그라운드에서 실행되기 때문에
사용자의 눈에는 보이지 않습니다.
 

hwp.XHwpWindows.Active_XHwpWindow.Visible = True

 
위 코드는 한글 프로그램의 창을 화면에 표시하는 역할을 합니다.
 
 

2) 두 번째 방법

 
다음 코드 역시 동일한 기능을 수행합니다.

import win32com.client as win32

hwp = win32.gencache.EnsureDispatch('HWPFrame.HwpObject')
hwp.XHwpWindows.Active_XHwpWindow.Visible = True

 
결론을 말씀드리면
두번째 방법의 코드를 사용하는 것을 추천드립니다.
 

반응형

 

 대 제 목 Dispatch vs gencache.EnsureDispatch

 
이제 본격적으로 두 함수의 차이점에 대해 알아보겠습니다.
 
각 방식의 차이를 비유를 통해 알아보겠습니다.
 
Dispatch어떤 기기를 사용할 때마다
매뉴얼을 살펴보며 기기를 작동하는 것과 유사합니다.
 
gencache.EnsureDispatch메뉴얼을 미리 공부하고
기기를 작동하는 것과 유사합니다.
 
그렇기 때문에 Dispatch느리지만 상대적으로 오류가 적습니다.
gencache.EnsureDispatch빠르지만, 상대적으로 오류가 발생할 가능성이 높습니다.
 
해당 기기의 버전이 업데이트되었을 경우
Dispatch는 업데이트된 매뉴얼을 보고 기기를 작동시키지만,
gencache.EnsureDispatch는 업데이트 전 메뉴얼을 기억하고 있으므로,
기억하고 있는 매뉴얼대로 기기를 작동하려 합니다.
 
그렇기 때문에 gencache.EnsureDispatch가 상대적으로 불안정할 수 있습니다.  
 
이런 방식의 차이에서 성능의 차이도 발생합니다.
 
우선 gencache.EnsureDispatch는 
매뉴얼을 공부해야 하는 시간이 발생하므로
처음 실행은 Dispatch에 비해 상대적으로 느릴 수밖에 없습니다.
 
하지만 한번 공부를 다 하고 나면
그 뒤에는 매 번 매뉴얼을 찾아보는 Dispatch에 비해 
더 빠를 수밖에 없습니다.
 

 gencache.EnsureDispatch의 오류 대응 방법

 
아래 코드는 gencache.EnsureDispatch의 캐시 관련 오류가 발생했을 때
어느 정도 대응할 수 있는 코드입니다.

import win32com.client as win32
import os, shutil

def open_hwp():
    try:
        hwp = win32.gencache.EnsureDispatch('HWPFrame.HwpObject')
        return hwp
    except:
        cache_dir = win32.gencache.GetGeneratePath()
        if os.path.exists(cache_dir):
            shutil.rmtree(cache_dir)

        hwp = win32.gencache.EnsureDispatch('HWPFrame.HwpObject')
        return hwp
    finally:
        if 'hwp' in locals():
            hwp.XHwpWindows.Active_XHwpWindow.Visible = True

hwp = open_hwp()

 
이 코드는 간결하게 작성된 코드이며
gencache.EnsureDispatch로 실행 시 에러가 발생하면
캐시를 삭제하고 다시 한번 실행합니다.
 
이 코드의 문제는 COM 관련 오류가 아닌 다른 오류가 발생해도
캐시를 지우고 본다는 문제 등이 있지만,
어느 정도 대응은 가능합니다.
 

 마 치 며

 
처음 배우는 입장에서는 둘 중 어느 하나 되는 것으로 실행하면 됩니다.
우선은 무언가를 만들고 실행해 보는 것이 중요하다고 생각합니다.

[ 파이썬 관련 블로그 글 목록 ] 

파이썬(Python) 블로그 목록
반응형