인프런 커뮤니티 질문&답변

한파엑셀님의 프로필 이미지
한파엑셀

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

한/글 문서를 불러오고, 저장하고, 닫기

안녕하세요 표 생성이 막힙니다.

작성

·

102

1

import win32com.client
import os
import shutil

# 캐시 디렉토리 경로
cache_dir = os.path.join(os.getenv('LOCALAPPDATA'), 'Temp', 'gen_py')

# 캐시 디렉토리 삭제
if os.path.exists(cache_dir):
    shutil.rmtree(cache_dir)

# 캐시 재생성 및 한글 객체 생성
hwp = win32com.client.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")

# 문서 시작 위치로 커서 이동
hwp.MovePos(2)  # 문서 시작으로 커서 이동

# 표 생성: 행(5), 열(3)
act = hwp.CreateAction("TableCreate")
pset = act.CreateSet()
act.GetDefault(pset)
pset.SetItem("Cols", 3)
pset.SetItem("Rows", 5)
act.Execute(pset)

이게 실행코드고 오류는
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\gencache.py:255, in GetModuleForCLSID(clsid)
    254 try:
--> 255     __import__(sub_mod_name)
    256 except ImportError:

ModuleNotFoundError: No module named 'win32com.gen_py.7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0.IDHwpAction'

During handling of the above exception, another exception occurred:

FileNotFoundError                         Traceback (most recent call last)
Cell In[3], line 21
     18 hwp.MovePos(2)  # 문서 시작으로 커서 이동
     20 # 표 생성: 행(5), 열(3)
---> 21 act = hwp.CreateAction("TableCreate")
     22 pset = act.CreateSet()
     23 act.GetDefault(pset)

File ~\AppData\Local\Temp\gen_py\3.12\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0\IHwpObject.py:106, in IHwpObject.CreateAction(self, actidstr)
    103 ret = self._oleobj_.InvokeTypes(10031, LCID, 1, (9, 0), ((8, 1),),actidstr
    104 	)
    105 if ret is not None:
--> 106 	ret = Dispatch(ret, 'CreateAction', None)
    107 return ret

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\__init__.py:119, in Dispatch(dispatch, userName, resultCLSID, typeinfo, UnicodeToString, clsctx)
    117 assert UnicodeToString is None, "this is deprecated and will go away"
    118 dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch, userName, clsctx)
--> 119 return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\__init__.py:47, in __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, UnicodeToString, clsctx, WrapperClass)
     43 from . import gencache
     45 # Attempt to load generated module support
     46 # This may load the module, and make it available
---> 47 klass = gencache.GetClassForCLSID(resultCLSID)
     48 if klass is not None:
     49     return klass(dispatch)

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\gencache.py:200, in GetClassForCLSID(clsid)
    198 if CLSIDToClass.HasClass(clsid):
    199     return CLSIDToClass.GetClass(clsid)
--> 200 mod = GetModuleForCLSID(clsid)
    201 if mod is None:
    202     return None

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\gencache.py:264, in GetModuleForCLSID(clsid)
    261         info = demandGeneratedTypeLibraries[info]
    262     from . import makepy
--> 264     makepy.GenerateChildFromTypeLibSpec(sub_mod, info)
    265     # Generate does an import...
    266 mod = sys.modules[sub_mod_name]

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\makepy.py:377, in GenerateChildFromTypeLibSpec(child, typelibInfo, verboseLevel, progressInstance, bUnicodeToString)
    374 progress.LogBeginGenerate(dir_path_name)
    376 gen = genpy.Generator(typelib, info.dll, progress)
--> 377 gen.generate_child(child, dir_path_name)
    378 progress.SetDescription("Importing module")
    379 importlib.invalidate_caches()

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\genpy.py:1363, in Generator.generate_child(self, child, dir)
   1361 out_name = os.path.join(dir, an_item.python_name) + ".py"
   1362 worked = False
-> 1363 self.file = self.open_writer(out_name)
   1364 try:
   1365     if oleitem is not None:

File ~\AppData\Roaming\Python\Python312\site-packages\win32com\client\genpy.py:1049, in Generator.open_writer(self, filename, encoding)
   1039 def open_writer(self, filename, encoding="mbcs"):
   1040     # A place to put code to open a file with the appropriate encoding.
   1041     # Does *not* set self.file - just opens and returns a file.
   (...)
   1046     # don't step on each others' toes.
   1047     # Could be a classmethod one day...
   1048     temp_filename = self.get_temp_filename(filename)
-> 1049     return open(temp_filename, "wt", encoding=encoding)

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\lemon\\AppData\\Local\\Temp\\gen_py\\3.12\\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0\\IDHwpAction.py.7700.temp'

이렇게 나오는데 해결할 수 있는 방법 있을까요?

답변 1

1

일코님의 프로필 이미지
일코
지식공유자

레몬민트님 안녕하세요?

해당 오류는 TableCreate 액션으로 인한 오류가 아니라, 아래아한글 인스턴스가 생성되지 않은 것으로 보입니다.

 

캐시디렉토리를 삭제하신 특별한 이유가 있으실까요?

 

참고로, 아래 코드로 바꿔 실행하시면

오류는 없어질 듯 합니다.

 

#%pip install pyhwpx
from pyhwpx import Hwp

hwp = Hwp()
hwp.create_table(3, 5)

 

저도 뚜렷한 오류원인을 파악해보겠습니다.

감사합니다.

한파엑셀님의 프로필 이미지
한파엑셀
질문자

오류를 해결하려고 여러 시도를 하다보니 캐시 디렉토리로 문제가 생기는 경우도 있어서 삭제를 넣었습니다.

 

주신 코드가 잘 작동하기는 하나 실행 후 컴파일 에러가 이렇게 나는군요

--------------------------------------------------------------------------- com_error Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_14292\3428825549.py in ?() 1 from pyhwpx import Hwp 2 3 hwp = Hwp() ----> 4 hwp.create_table(3, 5) c:\Users\lemon\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyhwpx.py in ?(self, rows, cols, treat_as_char, width_type, height_type, header, height) 2594 # 제목 행 여부 적용(header) 2595 pset = self.hwp.HParameterSet.HShapeObject 2596 self.hwp.HAction.GetDefault("TablePropertyDialog", pset.HSet) 2597 pset.ShapeTableCell.Header = header -> 2598 self.hwp.HAction.Execute("TablePropertyDialog", pset.HSet) ~\AppData\Local\Temp\gen_py\3.12\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0.py in ?(self, actname, pVal) 33 def Execute(self, actname=defaultNamedNotOptArg, pVal=defaultNamedNotOptArg): 34 'method Execute' ---> 35 return self._oleobj_.InvokeTypes(15001, LCID, 1, (11, 0), ((8, 1), (9, 1)),actname 36 , pVal) com_error: (-2147417851, '서버에서 예외 오류가 발생했습니다.', None, None)

 

 

일코님의 프로필 이미지
일코
지식공유자

(혹시, 주피터 실행시에는 잘 되지만, 컴파일로 만들어 실행할 때는 오류가 난다는 말씀인지요?)

 

create_table 메서드에서 오류가 나는 게 흔한 경우는 아닌데, 로컬환경의 뭔가에 오류 원인이 있는 것 같습니다.

 

혹시 한/글 버전이 어떻게 되나요?

 

pyhwpx.Hwp 클래스의 create_table 메서드 소스코드를 열어보시면 표를 생성하는 액션과 필수 파라미터셋 목록을 모두 매핑해놓았습니다. 해당 코드 참고하셔서 액션을 정의하는 기존의 방식으로 코드 완성하시면 급한 불은 끌 수 있겠습니다. pyhwpx로 만든 hwp인스턴스나, win32로 생성하는 hwp 개체나 거의 동일하므로, 캐시 따로 조작하지 마시고 pyhwpx를 쓰시는 것을 추천드립니다.

 

확실하진 않지만, pythonwin으로 MakePy Utility를 실행하셔서 아래아한글 타입라이브러리를 한 번 재생성하시면 위의 오류들이 없어질 듯도 합니다.

 

답변이 진짜 엉성하고 대충이네요.. 죄송합니다. 밖에 나와 있어서ㅜ

한파엑셀님의 프로필 이미지
한파엑셀
질문자

아뇨아뇨 괜찮습니다 ㅎㅎ

제가 현재사용중인 한글버젼은 2022버젼이고 컴파일 에러 안생기게 제가 직접 수정했으니 괜찮아요 😊 (pyhwpx 약간 뜯어봤는데, 쓸 수 있는 것들이 많아서 좀 놀랐어요!!)

 

맨 땅에서 이 정도까지 만드셨다는게 존경스럽네요 :)

일코님의 프로필 이미지
일코
지식공유자

자동화 교육이나 부업 때 유용하게 써먹은 아이디어를

메서드나 프로퍼티 형태로 만들어 pyhwpx에 추가하고 있습니다.

보시면 아시겠지만, 별다른 체계나 구조도 전혀 없고,

중구난방입니다ㅜㅜㅜ

한파엑셀님의 프로필 이미지
한파엑셀
질문자

확실히 pyhwpx 모듈 자체가 코드 안정성이 떨어지긴 합니다 🙂

그래서 제가 pyhwpx를 참고해서 hwpWings 라는 모듈을 2026년까지 새로 하나 만드려고해요 ㅎㅎ

이런 소중한 연구자료 남겨주셔서 감사합니다!

앞으로 많이 질문하겠습니다 :)

한파엑셀님의 프로필 이미지
한파엑셀
질문자

pyhwpx의 create_table 관련 오류가

바로 아래 저 구문 때문인데, 아래 코드처럼 try-except 구문을 쓰거나 빼버리니 오류가 안나더라구요 🙂 다른 컴퓨터에선 모르겠지만, 기능은 정상작동하고 오류 안나니까

제 개인적인 생각으로 저 구문은 빼는게 나을 것 같습니다 ㅎㅎ

self.hwp.HAction.Execute("TablePropertyDialog", pset.HSet)
# 제목 행 여부 적용(header)
        pset = self.hwp.HParameterSet.HShapeObject
        self.hwp.HAction.GetDefault("TablePropertyDialog", pset.HSet)
        pset.ShapeTableCell.Header = header
        # try:
        #     self.hwp.HAction.Execute("TablePropertyDialog", pset.HSet)
        # except:
        #     pass
한파엑셀님의 프로필 이미지
한파엑셀

작성한 질문수

질문하기