research:embeddedpython
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
research:embeddedpython [2014/01/26 22:56] – [세번째 예제] changwoo | research:embeddedpython [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 127: | 줄 127: | ||
=== C의 데이터를 파이썬의 객체형으로 표현 === | === C의 데이터를 파이썬의 객체형으로 표현 === | ||
- | 우선 C의 데이터를 파이썬의 객체형으로 표현하는 법에 대해 설명합니다. C에서 파이썬의 문자열을 생성하는 함수는 [[http:// | + | 우선 C의 데이터를 파이썬의 객체형으로 표현하는 법에 대해 설명합니다. C에서 파이썬의 문자열을 생성하는 함수는 [[http:// |
<code C> | <code C> | ||
char *str = NULL; | char *str = NULL; | ||
줄 403: | 줄 403: | ||
==== 정리 ==== | ==== 정리 ==== | ||
- | * 프로그램 시작: Py_SetProgramName() (선택적), | + | * 프로그램 시작: Py_SetProgramName(선택적), |
- | * 프로그램 종료: Py_Finalize() | + | * 모듈 불러오기 |
+ | * PyImport_Import: | ||
+ | * PyImport_ImportModule: | ||
+ | * 주의! 모듈 경로에 현재 디렉토리가 포함되지 않음. | ||
+ | * 해결책 | ||
+ | - setenv(" | ||
+ | - PyRun_SimpleString(" | ||
+ | * 모듈에서 객체(클래스, | ||
+ | * PyObject_GetAttrString | ||
+ | * 호출 가능한(callable) 객체 부르기 | ||
+ | * PyObject_Call: | ||
+ | * PyObject_CallObject: | ||
+ | * PyObject_CallFunction: | ||
+ | * PyObject_CallMethod: | ||
+ | * PyObject_CallFunctionObjArgs: | ||
+ | * PyObject_CallMethodObjArgs: | ||
+ | * 값 가져오기 | ||
+ | * Int, Long, Float, Complex, String: Py[python_type]_As[c_type] | ||
+ | * Dictionary, List: PyDict_GetItem, | ||
+ | * 값 설정하기 | ||
+ | * Int, Long, Float, Complex, String: Py[python_type]_From[c_type] | ||
+ | * Dictionary, List: PyDict_SetItem, | ||
+ | * 레퍼런스 설정하기 | ||
+ | * Py_INCREF, Py_DECREF: 레퍼런스 카운트 증가, 감소 | ||
+ | * Py_CLEAR: 레퍼런스 카운트를 없앰 | ||
+ | * 프로그램 종료: Py_Finalize | ||
- | ===== boost python 사용하기 ===== | + | ===== boost.python 사용하기 ===== |
C API를 활용하여 원하는 기능을 구현할 수도 있지만, 간단한 데이터를 가져오는데도 상당히 코드가 많이 필요합니다. API를 간단히 파악하는 정도로 두고, 보다 간결하고 편리하게 쓸 수 있는 라이브러리를 찾아야 할 것 같습니다. | C API를 활용하여 원하는 기능을 구현할 수도 있지만, 간단한 데이터를 가져오는데도 상당히 코드가 많이 필요합니다. API를 간단히 파악하는 정도로 두고, 보다 간결하고 편리하게 쓸 수 있는 라이브러리를 찾아야 할 것 같습니다. | ||
[[https:// | [[https:// | ||
+ | <code make Makefile> | ||
+ | CC = / | ||
+ | PYTHON_CONFIG = / | ||
+ | BOOST_INC_PATH = / | ||
+ | BOOST_LIB_PATH = / | ||
+ | CFLAGS = `$(PYTHON_CONFIG) --cflags` -I $(BOOST_INC_PATH) | ||
+ | LDFLAGS = `$(PYTHON_CONFIG) --ldflags` -L $(BOOST_LIB_PATH) -lboost_python-mt | ||
+ | TAR = test.out hello_py.out # 여기에 .out 파일을 추가하세요 | ||
+ | OBJ = $(TAR: | ||
+ | SRC = $(TAR: | ||
+ | |||
+ | all: $(TAR) | ||
+ | .o.out: $(OBJ) | ||
+ | $(CC) $(LDFLAGS) | ||
+ | |||
+ | .cpp.o: %.cpp | ||
+ | $(CC) $(CFLAGS) | ||
+ | |||
+ | clean: | ||
+ | rm -rf $(TAR) $(OBJ) | ||
+ | </ | ||
+ | |||
+ | ==== 첫번째 boost.python 예제 ==== | ||
+ | <code cpp hello_py.cpp> | ||
+ | #include < | ||
+ | |||
+ | int main(int argc, char** argv) | ||
+ | { | ||
+ | Py_Initialize(); | ||
+ | boost:: | ||
+ | Py_Finalize(); | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 현재는 별다른 것이 없어 보이네요 | ||
+ | |||
+ | ==== 두번째 boost.python 예제 ==== | ||
+ | |||
+ | <code cpp call.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | namespace bp = boost:: | ||
+ | |||
+ | void workaround_for_local_modules() | ||
+ | { | ||
+ | PyRun_SimpleString( | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | |||
+ | int main(int argc, char** argv) | ||
+ | { | ||
+ | if (argc < 3) { | ||
+ | fprintf(stderr," | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | Py_Initialize(); | ||
+ | workaround_for_local_modules(); | ||
+ | |||
+ | try { | ||
+ | bp:: | ||
+ | bp:: | ||
+ | bp:: | ||
+ | |||
+ | module_name = bp:: | ||
+ | module = bp:: | ||
+ | func = module.attr(argv[2]); | ||
+ | |||
+ | if(func && PyCallable_Check(func.ptr())) { | ||
+ | bp:: | ||
+ | |||
+ | tuple = bp:: | ||
+ | for(int i = 0; i < argc - 3; ++i) { | ||
+ | PyObject* arg; | ||
+ | arg = PyInt_FromLong(atoi(argv[i+3])); | ||
+ | PyTuple_SetItem(tuple.ptr(), | ||
+ | } | ||
+ | |||
+ | bp:: | ||
+ | int value; | ||
+ | |||
+ | valueObj = bp:: | ||
+ | value = bp:: | ||
+ | |||
+ | std:: | ||
+ | } | ||
+ | |||
+ | } catch(bp:: | ||
+ | PyErr_Print(); | ||
+ | } | ||
+ | |||
+ | Py_Finalize(); | ||
+ | return EXIT_SUCCESS; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | |||
+ | ==== 세번째 boost.python 예제 ==== | ||
+ | <code cpp count_href.cpp> | ||
+ | |||
+ | </ | ||
===== 참고 사이트 ===== | ===== 참고 사이트 ===== | ||
* [[http:// | * [[http:// | ||
* [[https:// | * [[https:// | ||
+ | * [[http:// |
research/embeddedpython.1390776968.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)