맥(macOS)에서 cmake를 사용해 C++ 코드에 파이썬을 내장해봤습니다.
예전에 C++로 개발하던 프로젝트에서 오픈소스를 사용한 적이 있는데요,
라이브러리 링킹을 못해서 헤매다가 결국 Python으로 짠 코드를 내장하려고 시도한 적이 있었습니다.
하지만 시도는 실패했고 결국 삼 일간의 삽질 후 cmake로 라이브러리 링킹을 성공했었는데, 그 3일간의 스트레스가 아직 남아있습니다.
요새 블로그 주제가 떨어진 와중에 C++ 코드에 파이썬을 내장해보고 그 방법을 정리하면 좋겠다는 생각이 들어서 시도해봤습니다.
이번 포스팅에는 파이썬 코드를 실행시키는 방법, 파이썬 파일을 내장하는 방법을 정리했습니다.
공식 홈페이지에서 관련 문서를 제공해주지만, 아래의 코드만으로는 이미 실패를 해서 간단하게 참고만 하시면 될 것 같습니다.
공식 홈페이지 ☛ 다른 응용 프로그램에 파이썬 내장하기
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' 카테고리의 다른 글
[ReactNative] TypeError: Network request failed 해결 (0) | 2021.09.10 |
---|---|
react-native cocoapods 에러 해결 (0) | 2021.08.25 |
[LaTex] 한글 및 특수문자 사용하기 (0) | 2020.03.25 |
PCL Iterative Closest Point 튜토리얼 분석 (5) | 2020.03.10 |
CMake로 Boost 라이브러리 링킹하기 (0) | 2020.03.08 |