사용자 도구

사이트 도구


project:embeddedpythonusingcapi

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

project:embeddedpythonusingcapi [2014/03/03 17:56] – [모듈 함수] changwooproject:embeddedpythonusingcapi [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1
줄 409: 줄 409:
 } }
 </code> </code>
-또는 함수의 객체를 끝까지 레퍼런스한 다음 ''[[http://docs.python.org/2/c-api/object.html#PyObject_CallMethod|CallFunction()]] 함수를 부를 수도 있습니다.+또는 함수의 객체를 끝까지 레퍼런스한 다음 ''[[http://docs.python.org/2/c-api/object.html#PyObject_CallMethod|CallFunction()]]'' 함수를 부를 수도 있습니다.
 <code c> <code c>
 /* Multiply = my_def.Multiply */ /* Multiply = my_def.Multiply */
줄 426: 줄 426:
  
 ==== 클래스 함수 ==== ==== 클래스 함수 ====
-모듈의 내 함수나 클래스의 함수나 같은 관점에서 바라볼 수 있습니다. 그러므로 ''PyObject_CallMethod()'' 함수를 이용하면 클래스의 함수를 호출하면 됩니다.+모듈의 내 함수나 클래스의 함수나 같은 관점에서 바라볼 수 있습니다. ''PyObject_CallMethod()'' 함수를 이용하여 클래스의 함수를 호출하면 됩니다.
  
 <code c> <code c>
줄 451: 줄 451:
 } }
 </code> </code>
 +
 +그런데 이렇게 모듈을 끄집어 내고, 클래스를 끄집어 내고, 함수를 끄집어내고... 끄집어내고 끄집어내다 보면 if 문의 홍수가 나죠. 레퍼런스 관리는 철저하게 해야 하는데, 그렇다고 에러 체크를 안 할 수도 없고... 결국 goto 명령을 쓰게 되더라구요.
 +
 ===== 리턴 값 추출 ===== ===== 리턴 값 추출 =====
 함수 호출을 통해 PyObject 객체의 레퍼런스를 받았다면, 이 객체의 값을 C의 자료구조로 해석해 내야 합니다. 함수 호출을 통해 PyObject 객체의 레퍼런스를 받았다면, 이 객체의 값을 C의 자료구조로 해석해 내야 합니다.
줄 457: 줄 460:
 기본 자료형들은 매우 간결하게 ''Py<X>_As<Y>()'' 함수 타입을 이용하면 됩니다. 'X'에는 파이썬 객체의 타입, Y는 C 타입의 자료형을 입력하면 됩니다. 기본 자료형들은 매우 간결하게 ''Py<X>_As<Y>()'' 함수 타입을 이용하면 됩니다. 'X'에는 파이썬 객체의 타입, Y는 C 타입의 자료형을 입력하면 됩니다.
  
 +==== 튜플/리스트 등의 자료형 ====
 +이외의 자료형들은 레퍼런스를 참고하라는 마법의 단어로 생략하도록 하겠습니다. 여기까지 읽고 이해했다면 아마 레퍼런스를 보고 어떻게 값을 가져올지 감이 잡히셨으리라 생각합니다. 레퍼런스의 '[[http://docs.python.org/2/c-api/abstract.html|Abstract Objects Layer]]'와 '[[http://docs.python.org/2/c-api/concrete.html|Concrete Objects Layer]]' 부분을 읽어 보면 각각의 자료형에서 데이터를 어떻게 꺼내올지, 또 반대로 어떻게 집어넣을지에 대해 자세하게 설명되어 있습니다.
 +
 +파이썬 확장에 대해서는 그나마 몇몇 문서들을 만나긴 했지만, 파이썬 삽입에 대해서는 그다지 문서가 많지 않더군요. 처음에는 갈팡질팡했습니다. 그렇지만 문서를 작성하는 과정을 통해 C API를 레퍼런스를 보다 정독해보고 나니 그렇게까지 어려운 일은 아니라는 결론을 내렸습니다. 결국 파이썬 객체를 다루는 것이니, 파이썬이 동작하는 방식을 유추해보면 거의 흐름이 그려지게 되더군요.
  
 ===== 예제: URL의 콘텐츠 가져오기 ===== ===== 예제: URL의 콘텐츠 가져오기 =====
줄 590: 줄 597:
 } }
 </code> </code>
 +
 +파이썬 스크립트를 C에서 동작시키는 것에 불과하니, 서로 동작 결과는 동일합니다.
 +
 +===== 마치며 =====
 +파이썬에는 여러 라이브러리들이 잘 갖춰져 있고, 또 쓰기 매우 쉽게 되어 있습니다. 기존의 어떤 작업을 C/C++, 혹은 다른 언어 기반으로 하고 있다가 전혀 다른 아이디어를 떠올리게 되었습니다. 사용 중인 언어 환경에서는 외부라이브러리를 가져다가 빌드도 하고 세팅도 해야하고 ... 이것저것 밑작업도 많이 해야 하고 본 코드를 작성하는데도 조금 시간이 걸릴 수 있습니다.
 +
 +이럴 때 이 새로운 부분만을 파이썬 스크립트로 프로토타이핑을 할 수 있습니다. 그런데 양 프로그램간 데이터 전송, 좀 더 거창하게는 프로세스 통신이 이뤄지면 보다 더 좋겠죠. 이럴 때 파이썬 삽입이 적합한 것 같습니다. 
 +
 +저도 이 문서를 제작하게 된 계기가 된 것이, 어떤 프로그램을 제작하는데, 네트워킹 기능과 텍스트 처리가 다소 필요한 부분이었습니다. C++로 이것을 시작하려 하니 한숨만 나오더군요. 그래서 우선 파이썬을 통해 빨리빨리 아이디어 스케치를 했습니다. 기능 구현은 빠르게 되었고, 이렇게 구성을 하면 좋겠다는 확신이 들었습니다. 또한 같은 객체 설계를 하더라도 스크립트로는 후딱후딱 만들고 바꾸기도 쉬우니 편리했습니다. 여기서 단순하게 기능이 동작된다는 것도 확인하였지만, 여기서 빠르게 프로토타이핑을 한 것이 설계적인 측면에서도 나름 이득이 되더군요.
 +
project/embeddedpythonusingcapi.1393869396.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki