visual studio c++에서 python 호출하기

semi·2020년 6월 9일
1

연동

목록 보기
1/3

프로젝트 환경 설정

  1. 파이썬이 64bit일 경우, debug를 x86에서 x64로 변경해준다.

  2. 프로젝트 -> 속성에서 VC++ 디렉터리에 들어가서 포함 디렉터리에 (python include 폴더의 경로);를, 라이브러리 디렉터리에 (python libs 폴더의 경로);를 입력해준다.

  3. 링커 -> 입력에서 추가 종속성에 (python버전.lib);를 입력해준다. python이 3.6 버전일 경우, python36.lib;라고 입력한다.

헤더 추가

includePython.h 헤더를 추가하여준다.

//includePython.h

#ifdef _DEBUG
#define _DEBUG_WAS_DEFINED 1
#undef _DEBUG
#endif

#include <Python.h>

#ifdef _DEBUG_WAS_DEFINED
#define _DEBUG 1
#endif

cpp 실행 코드

case 1) 매개변수와 return 값이 없는 함수 실행

#include <iostream>
#include "includePython.h"
using namespace std;
int main()
{
	PyObject *pName, *pModule, *pFunc, *pValue;
	Py_Initialize();
	pName = PyUnicode_FromString("testFile"); // testFile.py를 PyObject로 생성한다.
	pModule = PyImport_Import(pName); // 생성한 PyObject pName을 import한다.
	pFunc = PyObject_GetAttrString(pModule, "test_func"); // 실행할 함수인 test_func을 PyObject에 전달한다. 

	pValue = PyObject_CallObject(pFunc, NULL); // pFunc에 매개변수를 전달해서 실행한다. 현재 매개변수가 NULL인 경우이다.
	
	Py_Finalize();
	return 0;
}

case 2) 문자열 매개변수와 string형 return 값이 있는 함수 실행

#include <iostream>
#include <string>
#include "includePython.h"
using namespace std;
int main()
{
	PyObject *pName, *pModule, *pFunc, *pValue, *pArg;
	Py_Initialize();
	pName = PyUnicode_FromString("testFile"); 
	pModule = PyImport_Import(pName);
	pFunc = PyObject_GetAttrString(pModule, "test_func"); 
	pArg = Py_BuildValue("(z)", (const char *)"hello"); // 문자열 hello를 담은 매개변수를 만든다.
	pValue = PyObject_CallObject(pFunc, pArg); // pFunc에 매개변수를 전달해서 실행한다.
	
											   
	PyObject *objectsRepresentation = PyObject_Repr(pValue); // 객체를 문자열로 표현한다.
	PyObject* str = PyUnicode_AsEncodedString(objectsRepresentation, "utf-8", "~E~"); // 객체를 인코딩한다.
	string result = PyBytes_AsString(str); // string으로 변환하여 준다.
	cout << result;
	

	Py_Finalize();
	return 0;
}

case 3) int형 매개변수와 int형 배열 return값이 있는 함수 실행

#include <iostream>
#include <string>
#include <vector>
#include "includePython.h"
using namespace std;
int main()
{
	PyObject *pName, *pModule, *pFunc, *pValue, *pArg, *ptemp, *objectsRepresentation;
	Py_Initialize();
	pName = PyUnicode_FromString("testFile"); 
	pModule = PyImport_Import(pName);
	pFunc = PyObject_GetAttrString(pModule, "test_func"); 
	pArg = Py_BuildValue("(i, i, i, i)", 1, 2, 3, 4); // int형 인자 4개를 전달한다.
	pValue = PyObject_CallObject(pFunc, pArg); // pFunc에 매개변수를 전달해서 실행한다.
	
	int count = (int)PyList_Size(pValue); // count 변수에 함수에서 반환된 배열의 size를 전달한다.
	vector<int> arr(count); // 배열을 저장할 vector 생성
	const char *return_val;
	
	for (int i = 0; i < count; i++)
	{
		ptemp = PyList_GetItem(pValue, i);
		objectsRepresentation = PyObject_Repr(ptemp);
		PyObject* str = PyUnicode_AsEncodedString(objectsRepresentation, "utf-8", "~E~");
		return_val = PyBytes_AsString(str);
		arr[i] = (float)strtod(return_val, NULL);
		cout << arr[i] << " ";
	}
	
	Py_Finalize();
	return 0;
}

2개의 댓글

comment-user-thumbnail
2021년 4월 15일

위의 내용대로 하니 실행이 자 되었습니다.
그런데 좀 더 깊이들어가
from scipy import interpolate 를 사용하니 작동을 안하네요.

그뿐 아니라 다른 서브모듈을 가진 모듈들은 전부 인식이 안되네요.

해결방법이 없을까요?

1개의 답글