파이썬이 64bit일 경우, debug를 x86에서 x64로 변경해준다.
프로젝트 -> 속성에서 VC++ 디렉터리에 들어가서 포함 디렉터리에 (python include 폴더의 경로);를, 라이브러리 디렉터리에 (python libs 폴더의 경로);를 입력해준다.
링커 -> 입력에서 추가 종속성에 (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
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;
}
위의 내용대로 하니 실행이 자 되었습니다.
그런데 좀 더 깊이들어가
from scipy import interpolate 를 사용하니 작동을 안하네요.
그뿐 아니라 다른 서브모듈을 가진 모듈들은 전부 인식이 안되네요.
해결방법이 없을까요?