작성
·
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)
저도 뚜렷한 오류원인을 파악해보겠습니다.
감사합니다.
(혹시, 주피터 실행시에는 잘 되지만, 컴파일로 만들어 실행할 때는 오류가 난다는 말씀인지요?)
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
오류를 해결하려고 여러 시도를 하다보니 캐시 디렉토리로 문제가 생기는 경우도 있어서 삭제를 넣었습니다.
주신 코드가 잘 작동하기는 하나 실행 후 컴파일 에러가 이렇게 나는군요
--------------------------------------------------------------------------- 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)