맥(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
'major' 카테고리의 다른 글
| Docker Windows 컨테이너 삽질 기록 (0) | 2021.05.13 |
|---|---|
| PPT로 AWS 아키텍쳐 그리기 (0) | 2021.03.15 |
| [LaTex] 한글 및 특수문자 사용하기 (0) | 2020.03.25 |
| PCL Iterative Closest Point 튜토리얼 분석 (5) | 2020.03.10 |
| CMake로 Boost 라이브러리 링킹하기 (0) | 2020.03.08 |