게시글
질문&답변
2024.11.20
13-2. 녹화된 스크립트매크로를 파이썬에서 활용하는 방법 --- 강의 내용이 안보입니다.
그렇네요ㅜㅜㅜ 글이 아니라 영상을 만들어서 올렸던 걸로 기억하는데,(처음부터 올린 적이 없었던 건가?ㄷㄷㄷ)녹화해서 업데이트하겠습니다!알려주셔서 감사합니다^^
- 1
- 2
- 33
질문&답변
2024.11.20
초심자의 향후 학습방향에 대해 조언을 듣고 싶습니다~!
주현님 안녕하세요?말씀을 읽어보니 저도 자주 하는 고민과 비슷하게 느껴지기도 합니다.해결책은 아닐 수 있지만 부디 일부라도 공감해주셨으면 좋겠습니다. 저는 며칠 전부터 모종의 이유로open3d나 pymeshlab, bpy 같은 포인트클라우드와 메쉬를 다룰 수 있는파이썬 모듈과 pytorch의 pointnet 같은 모델 사용법을 공부하고 있습니다. 근데 문제는 각 모듈들이 제공하는 기능이 어마어마하게 많은데다,필터나 메쉬구축 기법 하나하나가 굉장히 깊은 이론적 배경을 요구하기 때문에처음 접하는 저한테는 굉장히 막연하게 느껴집니다. 관련 문서도 상세하지 않고,전공도 아니었니까요. 그런 이유로 제가 선택한, 빠르게 학습하는 방식은 아래와 같았습니다.필터나 디노이징, 메쉬생성 알고리즘을 하나부터 열까지 일일이 결과를 체크하는 건 불가능하다!기간 내에 프로젝트를 끝내려면 공식문서를 일독하는 것도 불가능하다!우선 이론을 떠나서 내가 완성하고 싶은 프로젝트의 프로세스를 나름 구체화해보고,검색과 챗지피티를 통해서, 프로세스별로 수행가능한 유명 알고리즘 두 개 정도씩만 골라낸다.골라낸 알고리즘들을 최소로 이해한 후, 파이썬 코드로 결과물 하나를 끝까지 완성해본다.우선 이 과정에 익숙해진다. 공장에서 타올 찍어내듯이 반복해보기도 하고. 자동화도 해본다.딱 호기심이 돋는 만큼만 추가로 학습한다. 그 이상 학습하면 너무 피곤하다. (몇 년이나 써먹겠다고)딱 이 만큼만으로 모 기관에 자문 및 동영상 교안을 납품해서 11월 20일 오늘, 소정의 사례비 수령.당분간 이 프로젝트는 계속될 듯 하니, 틈틈이 추가로 공부해 두자. 필요한 만큼만.... 기승전 N잡 이야기였습니다ㅜ완전히 동일한 케이스는 아니지만,위와 비슷한 맥락에서의 "문제해결을 위한 발췌독"을 말씀드렸던 게 아닌가 싶습니다.(지금도 그렇게 생각하고 있고요.)물론 일일이 정주행해주시고, 깊이있게 연습하고 이해해주시는 것이강사인 제 입장에선 더 뿌듯하고 기쁜 일입니다!^^ 그치만 아래아한글 메서드나, 제공하는 액션들이 굉장히 방대하기도 하고,아래아한글만 그러겠습니까? 엑셀, 오토캐드나 일러스트레이터도 그렇지요.세상에 자동화할 작업이나 문서들도 정말 무한할 만큼 다양하기 때문에,(또 그에 비하면 제 코드나 예시들은 정말 하늘을 가린 손바닥 같은 느낌이고요.)굳이 모든 케이스나 코드예제를 경험해봐야 할까? 하는 생각이 들기도 합니다. 음, 제가 드리고 싶은 조언이랄 게 있겠습니까?굳이 제 지론을 말씀드리면, "제일 간단하고 쉬운 것들만으로 문제를 해결해보자~" 정도? 입니다.이해하기 어렵고 복잡한 것들을 굳이 미리 배우지 마시고필요한 시점이 오면 그 때 질문게시판에 남기셔도 늦지 않을 거예요. 참고로 파이썬에서 가장 유명한(?) 웹프레임워크인 django의 공식문서는분량이 어마어마한 걸로 유명한데요. 현재 최신버전인 5.1 기준으로자그마치 A4용지 2,925페이지입니다.이걸 다 읽고 나서 나만의 홈페이지를 만들겠다고 선언하면다들 발벗고 만류하지 않겠습니까?^^; 하여튼 아래아한글은, 공식문서도 있고,저뿐만 아니라 아래아한글 개발자들이 직접 질문에 답글 달아주는한컴개발자포럼이라는 곳도 있고,프로그램 안에 스크립트매크로도 있고,win32com을 살짝 래핑한 pyhwpx도 있고문법이 생소하긴 해도 복잡한 건 아니어서막상 또 문제가 닥치면 곧잘 배우실 수 있을 겁니다. 하여튼 주현님~열심히 학습해 주셔서 진심으로 감사드립니다.업무자동화는 깊이있는 분야는 아니지만굉장히 실용적이기도 하고, 생산성을 극대로 끌어올릴 수 있는 지식인 만큼유용하게 잘 활용해주시면 좋겠습니다. 또 질문 있으시거나,만들어보고 싶은 프로그램 있으면 알려주세요~ㅎ행복한 하루 되세요!!!!!! 갑자기 생각났는데 시간 되시면 아래 영상도 한 번 시청해보셔요ㅎhttps://www.youtube.com/watch?v=JtthbD3uvYY문서작성을 위한 자료를 취합하거나 연산, 차트로 만드는 코드 비중이 훨씬 많기는 하지만하여튼 최종 결과물은 아래아한글 문서로 만들어집니다ㅋ(필드에 값 넣기, 필드로 이동해서 이미지 넣기 정도의 간단한 기능만 활용하신 걸로 보입니다.)
- 1
- 1
- 23
질문&답변
2024.11.20
2-6. 필드속성 수정하기 에서 "자료다운" 버튼 클릭 시 오류가 뜹니다.
헉 그렇네요ㅜㅜㅜ내부 오류인 듯 한데,섹션 시작부분에 해당 파일의 링크를 직접 달아놓았습니다.(클릭하셔서 다운받으시면 되도록 조치해 두었습니다.)다소 긴 챕터인데, 재미있게 봐주시면 좋겠습니다.감사합니다^^행복한 하루 되세요!!
- 1
- 2
- 18
질문&답변
2024.11.19
SaveAs메소드에 대한 질문입니다
성락님 안녕하세요?ㅎhwp.SaveAs는 한/글에서 제공하는 "메서드"가 맞습니다.다만 액션시퀀스의 단축명령어라고 이해하시는 게 좋겠습니다.(SaveAs 실행시에도 내부적으로는 FileSaveAs_S와 동일한 액션이 실행되기 때문입니다.)그리고 "FileSaveAs_S"는 엄밀히는 "액션"이라고 부릅니다. (메서드가 아니고요.) 각각메서드 목록은 "한글 오토메이션" 문서에서,액션 목록은 "액션 오브젝트" 문서에서,액션 실행시 파라미터 설명은 "파라미터셋 오브젝트" 문서에서 확인하실 수 있지만,(관련페이지 : https://developer.hancom.com/hwpautomation)액션 테이블과 파라미터셋 테이블을 함께 참고하면서하나의 액션(예를 들면, 블록 저장) 코드를 완성하는 것은굉장히 번거롭고 고된 일입니다. 참고로 저도 (원인모를 오류 때문에 헤매는 경우가 아니라면)액션테이블이나 파라미터셋테이블을 전혀 거의 열어보지 않습니다. 대신 스크립트매크로를 씁니다.스크립트매크로로 녹화로 코드 추출이 안 되는 기능은한컴 개발자포럼에 문의합니다. 보통 하루 이내에 한컴 개발자 분들이 답변을 달아주십니다.그래도 재현이 안 되는 액션은 과감하게 포기하고 대안을 찾습니다.(대안도 없는 액션이라면 십중팔구 문제정의부터 잘못되었을 가능성이 높다고 생각해버립시다.) 하여튼 FileSaveAs_S 액션을 녹화하는 과정은 아래와 같습니다.(사진)불필요하게 미리보기 이미지를 저장하는 PictureSaveAsAll 액션도 녹화가 되었는데, 이건 무시해도 됩니다. 녹화를 자주 하다 보면 나름의 필터링 노하우가 생깁니다. 이렇게 녹화된 코드는 jscript라는 언어 포맷입니다.function OnScriptMacro_중국어1성() { HAction.GetDefault("PictureSaveAsAll", HParameterSet.HSaveAsImage.HSet); with (HParameterSet.HSaveAsImage) { } HAction.Execute("PictureSaveAsAll", HParameterSet.HSaveAsImage.HSet); HAction.GetDefault("FileSaveAs_S", HParameterSet.HFileOpenSave.HSet); with (HParameterSet.HFileOpenSave) { FileName = "C:\\Users\\user\\Desktop\\ㅁㄴㅇㄹ.hwp"; Format = "HWP"; Attributes = 1; } HAction.Execute("FileSaveAs_S", HParameterSet.HFileOpenSave.HSet); } 파이썬으로 변환하는 방법은 간단한데,① 모든 변수는 hwp 안에 있으므로 hwp.~을 붙여주고,② jscript의 with문은 반복되는 인스턴스 이름과 속성을 축약하는 문법이므로다시 모두 전개하면,def save_block_as(): hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet) hwp.HParameterSet.HFileOpenSave.FileName = "C:\\Users\\user\\Desktop\\ㅁㄴㅇㄹ.hwp" hwp.HParameterSet.HFileOpenSave.Format = "HWP" hwp.HParameterSet.HFileOpenSave.Attributes = 1 hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)이런 모양이 됩니다. ③ 거의 완료되기는 했는데, 아직 두 가지 문제가 있습니다.먼저 FileName 속성을 filename으로 변경해줘야 합니다.win32com 단에서typelib을 파이썬 코드로 변환하는 과정에서 특정 속성명(파스칼케이스)을소문자로 치환해버리는 경우가 있습니다.두 번째로, 변환코드에는 hwp.HParameterSet.HFileOpenSave.HSet이위아래 두 번 정의되어 있습니다. (GetDefault와 Execute에서)그런데 가끔 각 HSet이 달라지는 경우가 있는데, 이 때는 오류가 발생합니다.이걸 방지하기 위해 변수(예를 들어 pset)에 담고, 해당 변수 pset을 반복해서 쓰면 됩니다. 이렇게 두 가지 방법을 적용한 최종 코드는아래와 같습니다.def save_block_as(path): pset = hwp.HParameterSet.HFileOpenSave hwp.HAction.GetDefault("FileSaveAs_S", pset.HSet) pset.FileName = path pset.Format = "HWP" pset.Attributes = 1 hwp.HAction.Execute("FileSaveAs_S", pset.HSet) 저는 보통 이런 식으로 함수(또는 메서드)로 만들고 재활용을 하는 편입니다.요약하면~① 매번 문서를 열어보기보다는, 스크립트매크로와 한컴개발자포럼을 활용② 스크립트매크로를 파이썬 코드로 변환하는 방법에 익숙해집시다.끝.
- 1
- 2
- 41
질문&답변
2024.11.18
win32com 모듈을 못 찾음
python 을 실행하시기 전에 터미널(명령 프롬프트)에서 `pip install pywin32`를 실행하셔서 모듈을 다운받아 설치하는 과정이 필요합니다. pip으로 pywin32 모듈을 설치했는데도 (드물지만) 동일한 오류가 나타날 수 있는데, 어떤 경우냐면 "여러 버전의 파이썬이 설치되고, 환경변수가 얽혀, 다른 버전의 파이썬에 pywin32가 설치되는 경우"입니다. pip도 파이썬 버전별로 만들어지니까요. 이런 경우에는 `pytyon -m pip install pywin32`라고 실행하시면 현재 폴더에서 최우선으로 실행되는 파이썬 버전의 pip으로 모듈 설치를 하게 됩니다. (아마 질문 주신 분의 경우에는 해당하지 않을 듯 합니다^^;)
- 1
- 2
- 29
질문&답변
2024.11.16
data = list( ~~~ .Value) 일 경우 오류 발생 이유?
헉 답변이 늦었어요!^^;문제정의를 하고 스스로 학습해 가시는 과정을 보니,학생 때에도 관심분야 공부를 잘 하셨을 듯 해요ㅎ 아래 제 설명이 다소 장황하더라도 천천히 읽어주시면 좋겠어요!^^ 1.우선data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]) print(data[2]) 1984-05-14 00:00:00+00:00위 코드 첫 라인 끝의 [0]을 빼겠다는 것은리스트나 튜플(혹은 문자열) 전체를 data에 담겠다는 뜻이지요. (주현님이 이해하신 바와 같아요.)(기존 코드는 배열 전체가 아니라 배열이 첫 번째 원소 [0]만 data에 담겠다고 명령한 거고요.) 2.근데 위와 같은 경우에는 Value가 어떤 형식인지, 혹은 사이즈가 어떻게 되는지 대략 알고 있어야 해요.우선 ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value만 출력을 해보면(사진)빨간 네모를 보면 좀 특이하지 않나요?괄호가 2중이거든요. 두 겹 튜플인 거죠. (2차원이라고도 부르고요.)엑셀의 ws.Range 메서드는 파이썬으로 값을 전송할 때, 특이하게 항상 2차원 튜플로만 내보내요.행이 하나든 여러개든 말예요. 이게 핵심인데 제가 설명을 빠뜨린 것 같네요ㅜ 하여튼 ws.Range로 값을 뽑으면 행이 하나라도(('A1셀', 'B1셀', 'C1셀', 'D1셀'),)식으로 두 겹이 되는데요.아직은 좀 생소할 수 있지만 조금만 파이썬에 익숙해지면,그냥 자연스럽고 당연하게 shape을 체크하게 되는 시점이 있을 거예요^^조금 거리가 있는 예시이긴 하지만예를 들어 케라스, 파이토치나 사이킷런 같은 머신러닝/딥러닝 프레임워크에서는데이터셋 한 개를 모델에 넣어야 할 때 [[1,2,3,4,5]] 라고 입력해야 하는데초보자들이 가장 많이 하는 실수 중 하나가 [1,2,3,4,5] 라고 넣는 거거든요. (우리랑 비슷하죠?^^;)혹은 OpenCV 같은 이미지 라이브러리를 다룰 때에도 그렇고, 하여튼 shape이 중요해요.다시 우리 예제로 돌아와서 보면,파이썬으로 가공할 때 가장 바깥쪽의 있으나마나한 튜플 한 겹을 걷어내려고[0] 인덱싱을 더한 거예요. 그리고 [0]을 넣지 않고 코드를 실행했을 때 오류가 났던 이유는 복잡한 게 아니라,현재 data튜플 안에 요소가 딱 한 개(요소가 네 개 들어있는 튜플) 밖에 안 들어 있으니까세 번째 요소(data[2])를 출력하라고 할 때 인덱스 오류가 발생한 거고요.(이 상태에서 오류가 나지 않게 조회하려면 data[0][2]라고 명령하면 되고요.) 이미 대부분 스스로 답을 찾으셨던데,하여튼 모든 의문이 해소되었길 바랍니다. 3.저는 아직도 파이썬 코딩 하면서IndexError, FileExistsError, TypeError 같은 오류를 정말 숨쉬듯이 만나거든요ㅋ주현님도 실수로 오류가 나왔을 때, 어떤 오류가 왜 나왔는지오류메시지를 (필요하면 트레이스백까지) 꼭 읽고, 이해하는 습관을 들이시면 좋겠어요.오류가 너무 길면 제일 아래에 출력되는 오류 종류와 설명만 읽으셔도 돼요. 예를 들어 주현님이 만났던 IndexError: list index out of range라는 오류는"해당 리스트의 크기보다 인덱스가 커서 요소를 인덱싱할 수 없어요!" 라는 뜻이니까,그때 그냥 생각 흐르는 대로,'왜 data의 크기가 2보다 작지? 값이 네 개 아니었나? data를 확인해볼까?'라며오류가 나는 라인 앞에 print(data)나 print(len(data))를 추가해보기도 하고,'아, data가 튜플을 하나 담고 있는 튜플이구나! 그 안의 튜플이 열데이터구나!?'를 알게 된다든지...이런 식으로 오류메시지를 활용하시면 코딩에 큰 도움이 돼요. 4.오류를 만나는 게 그리 나쁜 건 아닌 듯 해요. (자꾸 이야기가 오류 쪽으로 흘러가는데...)저도 퇴근하고 피곤한데, 일은 또 해야 하니까 컴퓨터 앞에 앉아 코딩을 할 때가 있거든요.그런 컨디션에서 에너지를 최대한 효율적으로 쓰면서 코딩을 무리없이 해낼 수 있는일종의 노하우가 있어요. 그건 바로, 오류를 가이드 삼아 코드를 작성하고 고치는 거예요.정신 바짝 차리고 긴장한 상태에서 모든 변수와 타입, 함수명을 머리에 담은 상태로 코딩을 하면뭔가 오류도 줄고 코딩이 잘 될 것 같은데, 그런 상태는 에너지 소모가 정말정말 크거든요?ㅜ근데,① 머리를 비우고(IDE가 다 보여주니까),② 오류에 놀라거나 스트레스 받지 않으면서(오히려 고마워하면서)코딩을 하고 있으면, 어느 시점에 자연스레 몰입도 되고그러면 코딩도 즐겁게 잘 마쳐지는 경우가 많아요.(의외로 EDD, Error Driven Development라는 용어도 실제로 쓰인답니다^^;) 5.아직은 주현님이 파이썬 문법 기초에 조금만 더 비중을 두시면 좋겠어요.엑셀이나 아래아한글 API 사용은 사실 간단하거든요?명령어 종류나 사용법이 너무 많으니까 복잡해 보이는 거지..(한컴 포럼에 보면 아래아한글 개발하시는 분들도 아래아한글 메서드 다 못 외워요..) 오히려 파이썬 기본 문법(반복문, 조건문)이랑 기본자료형(문자열, 숫자, 리스트, 튜플, 딕셔너리),기본자료형의 인덱싱과 메서드 사용법 정도까지만 먼저 익혀보셔도업무자동화 코딩이 정말 훨~씬 수월해질 거예요. 파이썬 기초는 자칫 따분하고 지루할 수도 있는 내용이지만,박응용 작가님의 점프투파이썬이나, 윤인성 작가님의 혼공파 같은 책들앞부분만 서너 번 반복해서 훑어보시면 주현님께 큰 도움이 될 거라고 믿어요.특히 점프투파이썬은 온라인으로 무료로도 읽어보실 수 있으니까요. 링크 그리고 win32com을 직접 다루는 내용은 아니지만pyhwpx라는 모듈로 아래아한글을 조작하는, 입문난이도의 무료 이북도 있거든요?인터페이스 차이는 조금 다르지만, 주현님이 다루시기에 좀 더 편하지 않을까 생각도 들어요. 링크 답글을 무슨 장문편지 쓰듯이 남겨버렸네요ㅜㅜㅜ정말 마지막으로 드리고 싶은 말씀은,완강은 정말 아무 의미 없어요.완강하고 나서 꼭 도전하고 싶은 업무 프로그램이 있다면지금 알려주세요.제가 간결한 코드, 꼼꼼한 주석에 컴파일로 exe파일까지 첨부해서답글로든 영상으로든 남겨드릴게요!ㅎ제가 할 수 없는 영역이라면, 학습루트나 다른 전문가를 소개해드릴게요. 그럼 행복한 하루 되세요^^
- 1
- 1
- 99
질문&답변
2024.11.14
f"{field}{{{{{index}}}}}": 에 대해 제가 이해한 게 맞을까요?
맞아요ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ어렵기도 하고 귀찮기도 합니다...근데 중괄호가 아래아한글에서도 파이썬에서도시맨틱하게 겹치는 기호이기 때문에이렇게 되어버립니다ㅠ 사실 django와 Vue.js를 같이 쓴다든지 할 때에도 동일한 문제가 발생하고,파이썬 뿐 아니라 다른 언어와 프레임워크에서도 문제가 되는 부분이기는 합니다.그래서 Vue.js는 {{ }} 노테이션을[[ ]] 라든지 다른 기호로 변경할 수 있는 기능도 제공하거든요..아래아한글은 그렇게까지 친절하진 않으니까요ㅜㅜㅜ 이해하신 내용이 완벽하게 맞고, (과장이 아니고, 정확합니다.)이 정도로 정확하게 (별 도움 없이) 이해하시는 분은사실 제가 본 적이 없습니다. 주현님은 이거 접하시기 전에 프로그래밍을 배우셨거나, 비슷한 일을 하시는 분이실까요?^^;이해력이 빠른 분들을 보면 신기하기도 하고 부럽기도 합니다.저도 머리가 빨리 돌아가는 편이 아니라서 배우는 것도 느리고알려드리는 건 항상 서툽니다ㅜ 더 많은 분들께 도움이 될 수 있게 더 잘 알려드리고 싶은데,제 머릿속에 구겨넣은 지식을 다른 사람들한테 잘 전달하는 게항상 쉽지 않네요ㅜㅜㅜ
- 1
- 1
- 42
질문&답변
2024.11.14
한글 2014버전의 경우 이 기능은 사용이 어렵나요?
성락님 안녕하세요?한글2014에서 안 되는 건 "CopyPage"와 "DeletePage" 정도이고다른 건 정상 실행되어야 맞습니다. pset = hwp.CreateSet이라고 실행하지 마시고act = hwp.CreateAction("액션이름") pset = act.CreateSet() # pset 파라미터 설정 후 act.Execute(pset)이런 식으로 실행하시면 됩니다. 어떤 액션을 시도 중이신지 알려주시면(혹은 작성중이신 코드를 알려주시면)한글 2014에서도 돌아갈 수 있게 도움을 드리고 싶습니다.
- 1
- 2
- 73
질문&답변
2024.11.13
한글 표의 필드명 표시방법이 있을까요?
성락님 안녕하세요?^^ 질문 남겨주셔서 감사합니다.셀의 필드명이 표시가 되지 않는 부분은 저도 항상 난감합니다.취합하는 hwp 문서가 10~100페이지가 넘어가는 경우도 있는데,표마다 셀필드 이름이 기억나지 않으니까요..억지로라도 셀필드 이름을 챕터명_표제목_셀이름처럼 길게 붙여보기도 했는데,코드가 너무 길어지더라고요. (사실 딱히 노하우라고 할 만한 건 저도 가지고 있지 않습니다.) 대신 요즘 대체로 사용하는 방식은,셀 하나하나에 이름을 매기기보다는 표 하나의 셀 모두에다 동일한 셀필드 이름을 매기고,엑셀 시트를 df로 만들어서 df 자체의 모든 값을리스트화해서 표에 일괄 집어넣는 방식으로 처리하고 있습니다. 셀 하나, 칼럼 한 줄 방식으로 구분하지 않고,파이썬 단에서 표와 동일한 사이즈의 df를 만들어버리는 방식으로전처리를 하면, 나름 시맨틱하게 처리가 되는 듯 합니다.(참고링크 : https://wikidocs.net/261665) 이게 의외로 편합니다.글쎄요, 노하우가 따로 있지는 않습니다.
- 1
- 2
- 58
질문&답변
2024.11.13
엑셀의 2행에서 7행의 데이터를 다루는데 for row in range(2, 8): 으로 해야하는 이유는?
마지막 정수는 포함하지 않습니다. 2~7까지 포함하려면 range(2, 8)을 써야 합니다.range(2, 8)은 2 이상 8 미만의 정수라는 의미가 됩니다.파이썬 문법이 그렇습니다^^; 파이썬 뿐만 아니라 자바나 C도 동일합니다.(사실 저도 아직까지 헷갈리는 부분이기도 합니다.)
- 1
- 1
- 28