gpt4 book ai didi

boost-python - 如何在主函数中使用 boost::python::dict 或元组?

转载 作者:行者123 更新时间:2023-12-03 22:23:23 25 4
gpt4 key购买 nike

当我在 main 中使用 boost::python::tuple 或 boost::python::dict 时功能,程序崩溃!

#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
#include <iostream>
#include <boost/python/tuple.hpp>
#include <boost/python/dict.hpp>

//using namespace std;
using namespace boost::python;

int main()
{
//tuple x;
//x = make_tuple(object(0),object(1));
dict x;
x["123"] = 3;
return 0;
}

但是当我在 .dll 中使用它们时,没事,怎么了?

最佳答案

有必要调用Py_Initialize()在使用任何 python 对象之前初始化解释器:

#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
#include <iostream>
#include <boost/python/tuple.hpp>
#include <boost/python/dict.hpp>

//using namespace std;
using namespace boost::python;

int main()
{
Py_Initialize();
dict x;
x["123"] = 3;
return 0;
}

Boost Python 提供了许多将 C++ 与 Python 接口(interface)的功能,还提供了一些使用 C++ 在更高级别创建 C 扩展的功能。上面的代码与下面的代码完全对应:
#include <Python.h>
#include <dictobject.h>

int main(int argc, char *argv[])
{
Py_Initialize();
PyObject *d = PyDict_New();
PyDict_SetItemString(d, "123", PyLong_FromLong(3));
return 0;
}

内部 PyDict_SetItemString有电话到 PyUnicode_InternInPlace这基本上试图使用一个已经存在的字符串,否则它会创建一个新字符串(请记住,python 字符串是不可变的)。
段错误(未调用 Py_Initilize 时)发生在此函数内部,因为 Python 需要查询其运行时环境以检查字符串,但一旦未加载环境,它就会崩溃。

无需显式调用 Py_Initilize创建 .dll 时,因为它是在初始化期间已调用它的解释器中导入的。

关于boost-python - 如何在主函数中使用 boost::python::dict 或元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com