본문 바로가기
my_lesson/_C++

C++ - Embeding Python3.7.3 in CPP project

by boolean 2019. 4. 16.
728x90

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 플랫폼 설정을 해줘야 합니다 (중요!!) 

embeding python

위의 그림처럼 구성관리자를 선택하고

구성관리자 창이 뜨면 활성 솔루션 플랫폼 - 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 로 이름 변경

 

 

댓글