사용자 도구

사이트 도구


project:embeddedpythonboostpython

차이

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

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
project:embeddedpythonboostpython [2014/03/06 11:08] – [예제: urllib을 C++에서 사용하기] changwooproject:embeddedpythonboostpython [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 ====== Embedded Python: Boost Python ====== ====== Embedded Python: Boost Python ======
 [[http://www.boost.org/doc/libs/1_55_0/libs/python/doc/|boost::python]]은 파이썬 확장(extended python)에 보다 초점을 맞춰져 있는 라이브러리입니다. 완전하게 임베딩을 완전히 지원하지는 않는다고 합니다(([[http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/embedding.html|Boost.Python - 1.55.0 <Tutorial Introduction> "Embedding" section]])). 지원하지 않는 부분들은 직접 [[http://docs.python.org/2.7/c-api/index.html|C API]]를 활용하여야 합니다. 그렇지만 그것만으로도 훨씬 더 생산성을 높일 수 있습니다. 사용할 만한 가치는 충분합니다.  [[http://www.boost.org/doc/libs/1_55_0/libs/python/doc/|boost::python]]은 파이썬 확장(extended python)에 보다 초점을 맞춰져 있는 라이브러리입니다. 완전하게 임베딩을 완전히 지원하지는 않는다고 합니다(([[http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/embedding.html|Boost.Python - 1.55.0 <Tutorial Introduction> "Embedding" section]])). 지원하지 않는 부분들은 직접 [[http://docs.python.org/2.7/c-api/index.html|C API]]를 활용하여야 합니다. 그렇지만 그것만으로도 훨씬 더 생산성을 높일 수 있습니다. 사용할 만한 가치는 충분합니다. 
 +
 +
 ===== Boost Python 개선되는 점 ===== ===== Boost Python 개선되는 점 =====
 ==== 자동 레퍼런스 카운팅 ==== ==== 자동 레퍼런스 카운팅 ====
줄 153: 줄 155:
 윈속이나 소켓이 같은 보다 저수준의 API은 파이썬 영역에서 처리되어 있습니다. 윈속이나 소켓이 같은 보다 저수준의 API은 파이썬 영역에서 처리되어 있습니다.
  
-===== =====+===== 예제: finder C++ ===== 
 +C API 기반의 [[.:embeddedpythonusingcapi#finder C 코드]]를 boost::python을 이용해 고쳐 보았습니다. 
 + 
 +<code cpp boost_finder.cpp> 
 +#include <boost/python.hpp> 
 +#include <iostream> 
 + 
 +namespace bp = boost::python; 
 +typedef bp::object bpobj; 
 + 
 +inline bpobj createObject(PyObject* op) 
 +
 +  if (op == NULL) { 
 +    throw bp::error_already_set(); 
 +  } 
 + 
 +  return bpobj(bp::handle<>(op)); 
 +
 + 
 +void boostFinder(const char* url) 
 +
 +  // import module 
 +  bpobj module = createObject(PyImport_ImportModule("scripts.finder")); 
 + 
 +  // get class object, instantiate the class 
 +  bpobj klass = module.attr("url_finder")(url); 
 + 
 +  // url_finder.links 
 +  bp::list links = bp::extract<bp::list>(klass.attr("links")); 
 +   
 +  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(), i)) 
 +                << '\n'; 
 +    } 
 +  } 
 +
 + 
 +int main(int argc, char **argv) 
 +
 +  if (argc < 2) { 
 +    std::cerr << "specify a url.\n"; 
 +    return 1; 
 +  } 
 + 
 +  if (Py_Initialize(), Py_IsInitialized()) 
 +  { 
 +    try 
 +    { 
 +      PySys_SetArgv(argc, argv); 
 +      boostFinder(argv[1]); 
 +    } 
 +    catch (bp::error_already_set const &) 
 +    { 
 +      PyErr_Print(); 
 +    } 
 +    Py_Finalize(); 
 +  } 
 +  return 0; 
 +
 +</code> 
 + 
 +===== 참고 사이트 ===== 
 +  * [[https://wiki.python.org/moin/boost.python|파이썬 위키]]
project/embeddedpythonboostpython.1394104111.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki