python - 使用转换器提升 Python 问题 - 静态链接
问题描述
我对以下代码有疑问。
这是一个如何通过 shared_ptr 将自定义类传递给嵌入式 python 代码的示例,并且在动态链接 boost 时它可以工作。
不幸的是,具有静态链接提升的相同代码不适用于以下错误消息:
“找不到 C++ 类型的 to_python(按值)转换器:类 boost::shared_ptr”。
我不明白为什么不同的链接会影响已注册转换器的类型识别。我错过了什么?
有人可以帮帮我吗?
谢谢,
多米尼克
示例来自这里。
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/python.hpp>
#include <string>
#include <iostream>
namespace bp = boost::python;
struct Foo{
Foo(){}
Foo(std::string const& s) : m_string(s){}
void doSomething() {
std::cout << "Foo:" << m_string << std::endl;
}
std::string m_string;
};
typedef boost::shared_ptr<Foo> foo_ptr;
BOOST_PYTHON_MODULE(hello)
{
bp::class_<Foo, foo_ptr>("Foo")
.def("doSomething", &Foo::doSomething)
;
};
int main(int argc, char **argv)
{
Py_Initialize();
try {
PyRun_SimpleString(
"a_foo = None\n"
"\n"
"def setup(a_foo_from_cxx):\n"
" print 'setup called with', a_foo_from_cxx\n"
" global a_foo\n"
" a_foo = a_foo_from_cxx\n"
"\n"
"def run():\n"
" a_foo.doSomething()\n"
"\n"
"print 'main module loaded'\n"
);
foo_ptr a_cxx_foo = boost::make_shared<Foo>("c++");
inithello();
bp::object main = bp::object(bp::handle<>(bp::borrowed(
PyImport_AddModule("__main__")
)));
// pass the reference to a_cxx_foo into python:
bp::object setup_func = main.attr("setup");
setup_func(a_cxx_foo);
// now run the python 'main' function
bp::object run_func = main.attr("run");
run_func();
}
catch (bp::error_already_set) {
PyErr_Print();
}
Py_Finalize();
return 0;
}
解决方案
据我了解有关 Boost Python 链接的文档,似乎用于将 Python 对象自动转换为 C++ 对象的转换注册表在静态链接时不可用。我面临同样的问题,很遗憾实际上是这样。我会想象至少所需的转换器是捆绑的,但恐怕由于某种原因并非如此。
推荐阅读
- reactjs - 成功提交表单时重定向错误 - 不工作
- python - 想将我的列转换为 Pandas 中 1 个新列下的类别值
- java - 如何创建字段
从jOOQ中的值T,明确地? - html - 由于 Next.js SSR(延迟加载的图像),React-scroll 不会完全滚动到元素
- reactjs - mobx 看不到数据
- python - 如何在 y=x 的函数的一行中编写 plt.scatter(x, y) 函数
- c# - C# - 由另一个数组拆分数组
- javascript - 如何将完整的字符串内容放入js
- sql - 查询表达式中的语法错误(缺少运算符) - 我在哪里将它括起来?
- statsmodels - 阐明用于时间序列预测的 statsmodels AutoReg()、ARMA() 和 SARIMAX()