visual studio c++에서 python 호출하기 (with anaconda)

semi·2023년 4월 19일
0

연동

목록 보기
3/3

https://velog.io/@dltpal07/visual-studio-c%EC%97%90%EC%84%9C-python-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0
아나콘다 환경의 python project를 c++에 포팅하는 방법을 정리한 글입니다. 추가적으로 상단의 포스트에서 부족한 점을 보충하였으니 도움이 되시기를 바랍니다.

프로젝트 환경 설정

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

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

  3. [링커 -> 입력]에서 추가 종속성에 {python버전.lib};을 입력해준다. 여기서 python 버전은 anaconda에서 사용하고 있는 python의 버전을 의미한다. python버전이 3.9일 경우, python39.lib;라고 입력한다.

+) c++ project 실행 시, python dll 참조를 못하는 경우가 있다. 이 경우, 해당 project 파일에 python3.dll 파일과 python버전.dll 파일을 추가하여준다. python3.dll과 python버전.dll 파일은 anaconda 폴더에서 찾을 수 있다.

예를 들어 c++ project명: Project2인 경우, C:\Users\User\source\repos\Project2\x64\Debug에 아래와 같이 python3.dll과 python39.dll파일을 넣어준다.

헤더 추가

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 실행 코드

#include <iostream>
#include <stdlib.h>
#include "includePython.h"

int main(void)
{
	_putenv("PYTHONHOME=C:/Users/User/anaconda3"); // local 변수로 PYTHONHOME을 설정해준다.
    _putenv("PYTHONPATH=C:/Users/User/anaconda3/include"); // local 변수로 PYTHONPATH를 설정해준다.
    PyObject *pName, *pModule, *pFunc, *pValue;
	Py_Initialize();
    pName = PyUnicode_FromString("tmp"); // tmp.py를 PyObject로 생성한다.
	pModule = PyImport_Import(pName); // 생성한 PyObject pName을 import한다.
    pFunc = PyObject_GetAttrString(pModule, "start_process"); // 실행할 함수인 start_process을 PyObject에 전달한다. 
	pValue = PyObject_CallObject(pFunc, NULL); // pFunc에 매개변수를 전달해서 실행한다. 현재 매개변수가 NULL인 경우이다.
    Py_Finalize();
	return 0;
}

+) path 설정이 제대로 안되어있을 경우 아래와 같은 error가 발생할 수 있다.

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

이러한 경우 시스템 환경 변수로 PYTHONHOME과 PYTHONPATH를 설정해주는 것도 하나의 방법이 될 수 있다. 그렇지만 pc에 여러 version의 python이 깔려있는 경우, 시스템 환경 변수로 PYTHONHOME과 PYTHONPATH를 설정하는 것은 다른 프로그램들에 영향을 줄 수 있다. 따라서 예시 코드처럼 _putenv를 통해 project 내에서의 임시변수로 설정해주었다.

python 파일 생성 및 c++ project 실행 결과

아래는 예시 python 코드이다.

# tmp.py

import numpy as np

def start_process():
    print("Hello, world!")
    a = np.array([1, 2, 3])
    print(a)

해당 tmp.py file을 c++ project.exe 파일이 있는 경로에 위치시켜준다.

그런 후, c++ project를 실행시켜주면 다음과 같은 결과를 얻을 수 있다.

0개의 댓글