본문 바로가기

major

C++ 코드에 파이썬 내장하기

맥(macOS)에서 cmake를 사용해 C++ 코드에 파이썬을 내장해봤습니다.

 

예전에 C++로 개발하던 프로젝트에서 오픈소스를 사용한 적이 있는데요,

라이브러리 링킹을 못해서 헤매다가 결국 Python으로 짠 코드를 내장하려고 시도한 적이 있었습니다.

하지만 시도는 실패했고 결국 삼 일간의 삽질 후 cmake로 라이브러리 링킹을 성공했었는데, 그 3일간의 스트레스가 아직 남아있습니다.

요새 블로그 주제가 떨어진 와중에 C++ 코드에 파이썬을 내장해보고 그 방법을 정리하면 좋겠다는 생각이 들어서 시도해봤습니다.

이번 포스팅에는 파이썬 코드를 실행시키는 방법, 파이썬 파일을 내장하는 방법을 정리했습니다.

 

공식 홈페이지에서 관련 문서를 제공해주지만, 아래의 코드만으로는 이미 실패를 해서 간단하게 참고만 하시면 될 것 같습니다.

공식 홈페이지 ☛ 다른 응용 프로그램에 파이썬 내장하기 

 

1. 다른 응용 프로그램에 파이썬 내장하기 — Python 3.8.2 문서

1. 다른 응용 프로그램에 파이썬 내장하기 이전 장에서는 파이썬을 확장하는 방법, 즉 C 함수의 라이브러리를 파이썬에 연결하여 파이썬의 기능을 확장하는 방법에 관해 설명했습니다. 다른 방법도 가능합니다: 파이썬을 내장시켜 C/C++ 응용 프로그램을 풍부하게 만들 수 있습니다. 내장은 C 나 C++가 아닌 파이썬으로 응용 프로그램의 일부 기능을 구현하는 능력을 응용 프로그램에 제공합니다. 이것은 여러 목적으로 사용될 수 있습니다; 한 가지 예는 사용자가 파

docs.python.org

 

1. 파이썬 코드 실행시키기

Python.h 헤더파일을 추가합니다. 실행하고 싶은 파이썬 코드를 PyRun_SimpleString() 함수 안에 넣습니다.

#include <iostream>
#include <Python.h>

using namespace std;

int main(int argc, char *argv[]) {

    Py_Initialize();

    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    PyRun_SimpleString("print(\"Hello, Python!\")\n");

    return 0;
}

그리고 CMakeLists.txt 파일에 아래와 같이 PythonLibs를 링크합니다.

cmake로 링킹하는 방법은 stackoverflow에서 찾았습니다 ☛ stackoverflow 링크

cmake_minimum_required(VERSION 3.15)
project(untitled)

set(CMAKE_CXX_STANDARD 14)

find_package(PythonLibs REQUIRED) // 추가
include_directories(${PYTHON_INCLUDE_DIRS}) //추가

add_executable(main main.cpp)
target_link_libraries(main ${PYTHON_LIBRARIES}) //추가

실행한 결과는 다음과 같습니다.

실행 화면

라이브러리 링킹만 잘 해주니까 간단했습니다.

 

2. 파이썬 파일 내장하기

이번에는 .py파일을 내장해보겠습니다.

실행파일이 있는 폴더에 print.py 파일을 생성합니다.

# print.py
from time import time,ctime

print('Today is', ctime(time()))
print("Hello, Python From print.py!")

 

main.cpp파일을 아래와 같이 수정합니다.

#include <iostream>
#include <Python.h>

using namespace std;

int main(int argc, char *argv[]) {

    Py_Initialize();

    PyObject *obj = Py_BuildValue("s", "print.py");
    FILE *file = _Py_fopen_obj(obj, "r+");
    if(file != NULL) {
        PyRun_SimpleFile(file, "print.py");
    }

    return 0;
}

CMakeLists.txt 파일은 수정할 필요 없습니다.

실행 결과

실행이 잘 됩니다.

 

cmake를 사용해서 링킹 하면 이렇게 간단하게 할 수 있었던 건데, 그땐 그걸 몰라서 많이 헤맸네요..ㅠㅠ

데이터의 값을 교환하는 더 고수준의 내장 방법도 제공하긴 하는데, 예전 프로젝트에서도 필요하진 않았어서 시도하지 않았습니다. 필요하신 분은 공식문서를 참고하시면 좋을것 같습니다.

 


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D