首页 / PYTHON / Python对象到C指针问题
Python对象到C指针问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python对象到C指针问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2109字,纯文字阅读大概需要4分钟。
内容图文
![Python对象到C指针问题](/upload/InfoBanner/zyjiaocheng/775/28fac08c4fb14f8ebc0feb9f0beca1f8.jpg)
这是我的第一篇文章 :).我可以将python扩展对象转换为C指针,但我有一个问题.首先,我将向您展示我的代码,然后我将解释这个问题.
这是我的班级:
#include <boost/python.hpp>
using namespace boost::python;
class Base
{
public:
virtual const char* HelloWorld() = 0;
};
class BaseWrapper : public Base, public wrapper<BaseWrapper>
{
public:
virtual const char* HelloWorld()
{
if (override f = this->get_override("HelloWorld"))
return call<const char*>(f.ptr());
return "FAILED TO CALL";
}
};
提升包装:
BOOST_PYTHON_MODULE(hello_ext)
{
class_<Base, boost::noncopyable>("Base", no_init);
class_<BaseWrapper, bases<Base> >("BaseWrapper")
.def("HelloWorld", &BaseWrapper::HelloWorld);
}
Python代码(hello.py):
def NewDerived():
import hello_ext
class Derived(hello_ext.BaseWrapper):
def __init__(self):
super(Derived, self).__init__()
def HelloWorld(self):
return "This is a Hello World!!!"
return Derived()
和主文件:
int main()
{
// Start the interpreter.
Py_Initialize();
// Import the module that we need (hello.py)
object module = import("hello");
// Get a C++ pointer of the derived python class.
Base* base = extract< Base* >( module.attr("NewDerived")() );
// Call the HelloWorld function
std::cout << base->HelloWorld() << std::endl;
}
当我运行我的应用程序时,我可以在屏幕上看到“这是一个Hello World !!!”正如我所料.
那么,问题是什么?假设我将python代码更改为:
def NewDerived():
import hello_ext
class Derived(hello_ext.BaseWrapper):
def __init__(self):
super(Derived, self).__init__()
def HelloWorld(self):
return "This is a Hello" # I CHANGED THIS LINE!!!!
return Derived()
然后,当我再次运行我的应用程序时,它崩溃,因为我在行中出错:
std::cout << base->HelloWorld() << std::endl;
因为base是NULL.
更确切地说,错误是“访问冲突读取位置0xblablabla”.
当我调试时,debugguer停在函数处(Boost或Python代码,我认为)
inline api::object_base::~object_base()
{
Py_DECREF(m_ptr);
}
你怎么看???
解决方法:
最后,另一位程序员向我解释了解决方案.
我不知道它为什么最初起作用,但问题是在我尝试调用成员函数之前对象被破坏了.我需要将提取调用分为两部分,如下所示:
object derived = module.attr("NewDerived")();
Base* base = extract< Base* >( derived );
这将使对象保持足够长的时间,以便我实际调用它上面的函数.
内容总结
以上是互联网集市为您收集整理的Python对象到C指针问题全部内容,希望文章能够帮你解决Python对象到C指针问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。