Khi làm việc trên một dự án C++, tôi đang tìm kiếm thư viện của bên thứ ba cho một thứ không phải là hoạt động kinh doanh cốt lõi của tôi. Tôi tìm thấy một thư viện thực sự tốt, làm chính xác những gì cần thiết, nhưng nó được viết bằng Python. Tôi đã quyết định thử nghiệm với việc nhúng mã Python vào C++, sử dụng thư viện Boost.Python.Python được nhúng trong CPP: cách lấy dữ liệu trở lại CPP
C++ mã trông một cái gì đó như thế này:
#include <string>
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
int main(int, char **)
{
Py_Initialize();
try
{
object module((handle<>(borrowed(PyImport_AddModule("__main__")))));
object name_space = module.attr("__dict__");
object ignored = exec("from myModule import MyFunc\n"
"MyFunc(\"some_arg\")\n",
name_space);
std::string res = extract<std::string>(name_space["result"]);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
A (rất) phiên bản đơn giản hóa của mã Python trông như thế này:
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
print result
Bây giờ vấn đề là thế này: 'MyFunc' thực hiện tốt, tôi có thể thấy bản in của 'kết quả'. Những gì tôi không thể làm là đọc 'kết quả' trở lại từ mã C++. Lệnh trích xuất không bao giờ tìm thấy 'kết quả' trong bất kỳ không gian tên nào. Tôi đã thử xác định 'kết quả' là toàn cầu, tôi thậm chí đã thử trả về một bộ tuple, nhưng tôi không thể làm cho nó hoạt động.
câu trả lời Phần lớn toàn diện hơn so với tôi, từ (tôi giả sử) cho cha mẹ đồng :) nosklo, tôi đề nghị bạn mở rộng câu trả lời của bạn với một ví dụ PyRun_String; nó cho phép linh hoạt hơn. – tzot
Tôi nghĩ rằng 'pArgs = PyTuple_New (0);' sẽ vượt qua 1 không phải 0. –