CPP - Embeding Python3.7.3 in CPP project
파이썬을 다른 언어로 짠 프로그램 안에 넣는 것을 Embedding이라고 하고
파이썬에서 C/C++ 등의 소스를 사용하는 것을 Extending이라고 합니다.
그중에서도 Embedding, 그 중에서도 Visual studio를 이용한 방법을 알아봅시다.
저는 Python 3.7버전으로 경로는 설치폴더 를 사용했구요, visual studio 2017 버전입니다
먼저, 포함 디렉터리, 라이브러리 디렉터리, 추가 종속성을 설정을 해야합니다 :)
1. 프로젝트 속성창을 띄우고 모든 구성을 선택합니다.
구성 속성 - VC++ 디렉터리 - 포함 디렉터리, 라이브러리 디렉터리를 각각 Python경로\include과 Python경로\libs 로 추가합니다.
(pythonXY.lib XY = Vesion ex) python37.lib 이라는 object file library 파일이 있는 경로가 libs)
포함 디렉토리(include directory) : Default - $(VC_IncludePath);$(WindowsSDK_IncludePath)
Write the include directory path at the beginning of the defaults >> Apply
기본값 제일 앞부분에 include 디렉토리 경로를 적어준다 >> 적용하기
라이브러리 디렉토리(library directory) : Default
- $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64
Write the library directory path at the beginning of the defaults >> Apply
기본값 제일 앞부분에 library directory 경로를 적어준다. >> 적용하기
2. 구성속성 - 링커 - 입력 - 추가 종속성에는 pythonXY.lib 을 등록합니다. (XY는 버전 숫자)
추가종속성 : Default - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
Add the default value as shown below. - Apply
기본값을 아래와 같이 추가 해준다. - 적용하기
- kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;python37.lib;%(AdditionalDependencies)
3. 파이썬 64bit 버전으로 깔았을 경우 64bit 플랫폼 설정을 해줘야 합니다 (중요!!)
위의 그림처럼 구성관리자를 선택하고
구성관리자 창이 뜨면 활성 솔루션 플랫폼 - x64를 선택하고 닫기를 선택한다.
4. 이제 #include <Python.h> 를 사용하기 전에
파이썬 외부 라이브러리를 사용하면 발생하는 릴리즈모드 빌드를 디버그모드 빌드가 되게 하기 위해 아래와 같이 헤더파일을 하나 만들고 cpp파일에서 include 시킨다.
PythonInclude.h
#ifdef _DEBUG
#define _DEBUG_WAS_DEFINED 1
#undef _DEBUG
#endif
#include
#ifdef _DEBUG_WAS_DEFINED
#define _DEGUG 1
#endif
5. 이제 파이썬 임베딩 소스를 작성해보자.
.py 파일에서 매개변수를 사용하지 않고 리턴값도 없는 메소드를 가저다 써보자.
embeddingPython.cpp
// Embedding Python in CPP
#include
#include "PythonInclude.h"
int
main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n");
if (Py_FinalizeEx() < 0) {
exit(120);
}
PyMem_RawFree(program);
return 0;
}
참조 : https://docs.python.org/3/extending/embedding.html
C++ 'python37_d.lib' 'python37_d.lib' not found
python 설치폴더/libs 로 이동
python37.lib 파일을 복사본 만든 후 python37_d.lib 로 이름 변경
'my_lesson > _C++' 카테고리의 다른 글
C++ - Array_For_numberPuzzleGame ver 1.0 (0) | 2019.04.26 |
---|---|
C++ - For 반복문 별그리기 ver 1.0 , ver 1.1 (0) | 2019.04.24 |
C++ - Array_For_LottoGame Ver 1.2 functional (0) | 2019.04.10 |
C++ - Array_For_BaseballGame Ver.1.0 (0) | 2019.04.05 |
C++ - Array_For_LottoGenerator 1.1 (0) | 2019.04.05 |
댓글