PyRevit이라는 한줄기 빛
나는 PyRevit을 이용해 Revit 플러그인을 개발한다. 오늘은 그 얘기를 조금 적어본다. 근데 내 글은 일기인가 에세이 인가 설명글인가. 나도 갈피를 잡을 수 없지만 나만의 스타일로 오늘도 적어본다.
dotnet Python을 이용하는 PyRevit
건축업계에서 프로그램을 개발하는 것은 정말 징글징글한 일이다. 대부분 상업용 도구가 Windows 운영체제를 중심으로 나와있고, 그런 영향으로 대부분 개발을 위한 API가 C#이라는 언어를 중심으로 되어있다. 그 C#이라는 언어가 참 징글징글한데, 내 관점에선 Window기반 몇 가지 개발을 빼고는 다른데 사용하기 상당히 까다로운 언어이다. UI를 할 수 있다지만 Javascript 기반 프레임워크들이 대다수고, Backend를 하자니 한국은 Java가 국룰이다. 아무튼 C#은 딱 Window를 위해서 하는 것 말고는 답이 없어 보인다. 그리고 AI 프레임워크와 Python이 맞물리며 엄청나게 Python 사용자는 엄청나게 증가했다.
그런 추세를 아는지 C#을 이용하는 dotnet에서도 Python을 dotnet위에서 사용할 수 있는 방법이 나왔다. 그것이 dotnet python 또는 ironpython이라고 하는 그런 것 들이다. 아마 Rhino나 Dynamo에서 Python을 써본 사람이라면 이 생뚱맞은 언어를 본 적이 있을 것이다. 우리가 흔히 설치하는 Python이랑 거의 유사한데, 그냥 window에 내장시켜 버리고 dotnet위에서 돌아가는 것이라고 보면 된다. 여기서 dotnet(. NET)이란 윈도에서 내놓은 cross-platform 프레임워크라고 보면 된다(사이트를 뒤지며). 냉정히 놓고 보면 cross-platform 개발 프레임워크가 워낙 많기 때문에 통상적인 개발자라면 발을 들일 일이 없는 분야라고 생각한다.
아무튼 다시 돌아와서 Revit API는 C#을 중심으로 구성되어 있다. C#을 쓰는 여러 자질구레한 단점을 차치하고 어쨌든 끝이 있는 언어를 선뜻 건드리고 싶지 않은 것이 내 생각이다. 그러다 보니 여러 궁리를 하게 되었고, C# 기반으로 이루어진 Revit API를 Python으로 읽고 쓸 수 있도록 해준 것이 PyRevit이라고 보면 된다.
초기 허들만 넘으면 꽤나 괜찮은 도구
C#으로 쓰인 내용을 Python으로 가져오는 내용이다 보니 초반에 다소 어려움이 따른다. 특히 자동완성이 안되다 보니 그 기능들을 일일이 찾아봐야 하는 단점도 있고, class별 변환들을 잘 이해해야 하는데 그런 것들이 헷갈리때가 많다. 그럴 바엔 C# 하지라는 생각을 할지도 모른다. 하지만 C#은 Compile언어이다. 즉, 내가 코드 몇 줄 바꿀 때마다 저장하고, compile 하고 플러그인을 다시 불러와야 하는 굉장한 불편함이 존재한다. 그런 면에서 pyrevit에 비해 개발 속도가 10배는 오래 걸리는 것 같다.
그렇다고 C#으로 만든 플러그인이 그리 빠르지도 않다. 그나마 장점이라고 한다면 하나의 dll 파일로 깔끔하게 배포 가능하다는 정도라고 생각한다. 여기에 의미부여를 많이 하는 사람들도 있는데 반대로 pyrevit기반 내용도 깔끔하게 배포만 된다면 C#을 더 써야 하는 이유는 거의 없다고 생각한다.
제대로 쓰기 위해선 C#, Python 둘 다 이해가 필요
사실 여기서 문제가 발생한다. PyRevit 패키지를 어떻게 배포할 것인가. 기본적으로 PyRevit에 Extension을 Github를 통해 추가하는 것도 가능하다. 그러나 몇몇 회사들은 보안이 빡세 Github에 올릴 수 없다. 즉 본인이 한 땀 한 땀 PyRevit 소스코드를 보고 회사에 알맞은 패키지를 추가하고 배포하는 내용을 다시 작성해야 한다는 것이다. 나는 그런 일을 한 번도 해본 적이 없다 보니 이게 얼마나 어려운지 가늠이 안되긴 한다. 오늘 잠시 테스트해 본 바로는 기본 PyRevit에 안 깔려있는 패키지를 추가로 넣는 게 상당히 어려웠다.
가령 PyRevit에는 잡다한 Excel 읽고 쓰기 패키지가 설치되어 있다. 특히나 읽기 패키지의 경우, xls는 지원하고 xlsx를 지원하지 않아 openpyxl을 설치해야 하는 상황이었다. site-packages에 패키지를 놓아서 해결하려 했지만 그 이상의 뭔가 설정을 했어야 했고 아직 성공하지 못했다.
이런 패키징 작업을 제대로 하려면 C#도 알아야 하는 게 사실이다. PyRevit 자체의 약 20%는 C#으로 이루어져 있기 때문이다.
좀 더 파서 패키징까지 해보는 것을 목표로 삼아야겠다.