project:embeddedpythonboostpython
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| project:embeddedpythonboostpython [2014/03/04 12:10] – [Embedded Python: Boost Python] changwoo | project:embeddedpythonboostpython [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| ====== Embedded Python: Boost Python ====== | ====== Embedded Python: Boost Python ====== | ||
| [[http:// | [[http:// | ||
| - | ===== Boost Python으로 | + | |
| + | |||
| + | ===== Boost Python 개선되는 점 ===== | ||
| ==== 자동 레퍼런스 카운팅 ==== | ==== 자동 레퍼런스 카운팅 ==== | ||
| [[http:// | [[http:// | ||
| - | boost:: | + | boost:: |
| === 자동 레퍼런스 카운팅 테스트 === | === 자동 레퍼런스 카운팅 테스트 === | ||
| - | 진짜 동작하는지 정말 확인해 보고자 다음과 같은 실험을 해 보았습니다. | + | boost 라이브러리야 믿고 쓰면 되는데, 그래도 좀 궁금하더군요. 진짜 자동으로 레퍼런스 카운팅 되는지. |
| - Py_INCREF, Py_DECREF는 매크로입니다. 헤더에 선언되어 있으므로 소스를 재컴파일하지 않아도 헤더 파일에 쓰기 권한만 있으면 접근하여 수정할 수 있습니다. 그러므로 여기 접근하여 살짝 변경해 호출이 되는 것 확인할 수 있도로 합니다. | - Py_INCREF, Py_DECREF는 매크로입니다. 헤더에 선언되어 있으므로 소스를 재컴파일하지 않아도 헤더 파일에 쓰기 권한만 있으면 접근하여 수정할 수 있습니다. 그러므로 여기 접근하여 살짝 변경해 호출이 되는 것 확인할 수 있도로 합니다. | ||
| - boost:: | - boost:: | ||
| 줄 64: | 줄 66: | ||
| - | ==== Try - Catch를 이용한 예외 처리 ====== | + | ==== Try ~ Catch를 이용한 예외 처리 ====== |
| - | C API를 사용하는 경우, 모든 값에 대해 에러 체크를 명시적으로 수행해야 | + | C API를 사용하는 경우, 모든 값에 대해 에러 체크를 명시적으로 수행해서 NULL이 리턴되는지 결과를 확인해야 |
| - | + | ||
| - | boost:: | + | |
| <code c> | <code c> | ||
| 줄 77: | 줄 77: | ||
| </ | </ | ||
| - | 이렇게. | + | boost:: |
| <code c> | <code c> | ||
| try { | try { | ||
| 줄 86: | 줄 85: | ||
| } | } | ||
| </ | </ | ||
| + | 예외 상황이 발생했을 때 모든 '' | ||
| ==== 보다 편리한 객체 호출 및 리턴 값 ==== | ==== 보다 편리한 객체 호출 및 리턴 값 ==== | ||
| - | 객체 | + | 파이썬 |
| - | 값 추출. | + | |
| + | C API를 바로 이용하는 경우 객체에 대해 '' | ||
| + | |||
| + | 여기서 템플릿 타입에는 C/C++의 기본 자료형도 가능하고, | ||
| + | |||
| + | ===== 예제: urllib을 C++에서 사용하기 ===== | ||
| + | 다음 코드는 C++에서 파이썬 ' | ||
| + | <code cpp get_html.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | namespace bp = boost:: | ||
| + | typedef bp::object bpobj; | ||
| + | |||
| + | inline bpobj CreateObject(PyObject* op) | ||
| + | { | ||
| + | if (op == NULL) throw bp:: | ||
| + | return bpobj(bp:: | ||
| + | } | ||
| + | |||
| + | void PrintUsage(std:: | ||
| + | { | ||
| + | os << "< Save URL > | ||
| + | os << " | ||
| + | os << " | ||
| + | } | ||
| + | |||
| + | int main(int argc, char** argv) | ||
| + | { | ||
| + | if (argc < 3) { | ||
| + | PrintUsage(std:: | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | if (Py_Initialize(), | ||
| + | try { | ||
| + | const char *url = argv[argc - 2]; | ||
| + | const char *file_name = argv[argc - 1]; | ||
| + | |||
| + | bpobj urllib | ||
| + | bpobj connobj = urllib.attr(" | ||
| + | bpobj htmlobj = connobj.attr(" | ||
| + | connobj.attr(" | ||
| + | |||
| + | // save as file | ||
| + | const char *html = bp:: | ||
| + | const int byte = bp:: | ||
| + | | ||
| + | std:: | ||
| + | | ||
| + | if (os.is_open()) { | ||
| + | os.write(html, | ||
| + | printf(" | ||
| + | os.close(); | ||
| + | } | ||
| + | } | ||
| + | catch (bp:: | ||
| + | PyErr_Print(); | ||
| + | } | ||
| + | Py_Finalize(); | ||
| + | } | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | 윈속이나 소켓이 같은 보다 저수준의 API은 파이썬 영역에서 처리되어 있습니다. | ||
| + | |||
| + | ===== 예제: finder C++ ===== | ||
| + | C API 기반의 [[.: | ||
| + | |||
| + | <code cpp boost_finder.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | namespace bp = boost:: | ||
| + | typedef bp::object bpobj; | ||
| + | |||
| + | inline bpobj createObject(PyObject* op) | ||
| + | { | ||
| + | if (op == NULL) { | ||
| + | throw bp:: | ||
| + | } | ||
| + | |||
| + | return bpobj(bp:: | ||
| + | } | ||
| + | |||
| + | void boostFinder(const char* url) | ||
| + | { | ||
| + | // import module | ||
| + | bpobj module = createObject(PyImport_ImportModule(" | ||
| + | |||
| + | // get class object, instantiate the class | ||
| + | bpobj klass = module.attr(" | ||
| + | |||
| + | // url_finder.links | ||
| + | bp::list links = bp:: | ||
| + | | ||
| + | if (PyList_Check(links.ptr())) | ||
| + | { | ||
| + | typedef Py_ssize_t psz_t; | ||
| + | |||
| + | const psz_t linkSize = Py_SIZE(links.ptr()); | ||
| + | for (psz_t i = 0; i < linkSize; ++i) | ||
| + | { | ||
| + | // borrowed reference | ||
| + | std::cout << PyString_AsString(PyList_GET_ITEM(links.ptr(), | ||
| + | << ' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | int main(int argc, char **argv) | ||
| + | { | ||
| + | if (argc < 2) { | ||
| + | std::cerr << " | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | if (Py_Initialize(), | ||
| + | { | ||
| + | try | ||
| + | { | ||
| + | PySys_SetArgv(argc, | ||
| + | boostFinder(argv[1]); | ||
| + | } | ||
| + | catch (bp:: | ||
| + | { | ||
| + | PyErr_Print(); | ||
| + | } | ||
| + | Py_Finalize(); | ||
| + | } | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| - | ===== 파이썬 기본 자료형 다루기 | + | ===== 참고 사이트 ===== |
| - | ==== Type Casting ==== | + | * [[https:// |
| - | ==== List ==== | + | |
| - | ==== Tuple ==== | + | |
| - | ==== Dictonary ==== | + | |
project/embeddedpythonboostpython.1393935018.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)
