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 (바깥 편집)