사용자 도구

사이트 도구


project:embeddedpythonboostpython

차이

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

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
project:embeddedpythonboostpython [2014/03/06 11:05] 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 개선되는 점 =====
 ==== 자동 레퍼런스 카운팅 ==== ==== 자동 레퍼런스 카운팅 ====
줄 93: 줄 95:
 ===== 예제: urllib을 C++에서 사용하기 ===== ===== 예제: urllib을 C++에서 사용하기 =====
 다음 코드는 C++에서 파이썬 'urllib'을 사용해 원격지의 자원을 로컬로 가져오는 예제입니다. 다음 코드는 C++에서 파이썬 'urllib'을 사용해 원격지의 자원을 로컬로 가져오는 예제입니다.
-<code>+<code cpp get_html.cpp>
 #include <boost/python.hpp> #include <boost/python.hpp>
 #include <iostream> #include <iostream>
줄 126: 줄 128:
       const char *file_name = argv[argc - 1];       const char *file_name = argv[argc - 1];
  
-      bpobj urllib  = CreateObject(PyImport_ImportModule("urllib2"));+      bpobj urllib  = CreateObject(PyImport_ImportModule("urllib"));
       bpobj connobj = urllib.attr("urlopen")(url);       bpobj connobj = urllib.attr("urlopen")(url);
       bpobj htmlobj = connobj.attr("read")();       bpobj htmlobj = connobj.attr("read")();
줄 152: 줄 154:
 </code> </code>
 윈속이나 소켓이 같은 보다 저수준의 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.1394103942.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki