如何在Python中处理SWIG控制器方法中的空指针

如何在Python中处理SWIG控制器方法中的空指针,python,c++,swig,Python,C++,Swig,我使用SWIG将C++库包装为Python库。 C++库公开了抽象类,以便用户从中继承,因此我们使用SWIG中的处理来处理。它的工作原理基本正常(经过一些调整) 一个问题是,C++类有以下两种方法: class Base { void* getObject(); void doSomething(void* o); } 期望用户实现这些方法,然后将用户在getObject()中返回的对象传递给doSomething()方法 问题是,在处理SWIG时,Python中的doSomethi

我使用SWIG将C++库包装为Python库。 C++库公开了抽象类,以便用户从中继承,因此我们使用SWIG中的处理来处理。它的工作原理基本正常(经过一些调整)

一个问题是,C++类有以下两种方法:

class Base {
  void* getObject();
  void  doSomething(void* o);
}
期望用户实现这些方法,然后将用户在getObject()中返回的对象传递给doSomething()方法

问题是,在处理SWIG时,Python中的doSomething()方法接收到一个包装类型为“void*”的SwigPyObject,因此我们不能像希望的那样使用原始Python对象方法。 铸造不是一种选择,因为它是Python(或者是Python?)

有人有什么见解吗

我在这里和那里发现了一些相关的问题,但没有一个能完全解决我的问题,我已经尝试了很多方法来解决它,但都没有成功

如果你需要更多的细节,请告诉我,我会提供的


非常感谢

首先,我们希望将您的代码变成真实且可运行的代码。我根据您展示的小代码编写了自己的test.hh,这让我们可以在某种程度上练习这种设计:

类基{
公众:
void runMe(){

我不明白你这里的设计-为什么是void*而不是类型继承人。在实际使用中,你实际使用的是什么类型?我们提供的是一个库,由用户定义getObject()返回的对象的类型。我们考虑创建某种类型的空对象类,并让getObject返回指向该对象类实例的指针。然后,用户将必须创建从该对象类继承的类。但是,我们仍然存在doSomething()中的问题Python方法,传入的对象只会从对象类中公开方法,而不是用户定义的派生类方法。因此Python代码可以传递任何东西,然后希望稍后再将其返回,但是只有Python实现需要理解它实际上是什么?是的,C++库不需要知道任何东西。我对传递给它的对象很感兴趣。您好,我今晚又尝试了。首先,我必须实现PyBase构造函数才能让它工作。但后来我遇到了一个问题,因为动态库没有某些符号。特别是,我的“Base”类用在了“List”之类的模板类中,但当我编译Python SWIG包装器时,我缺少了symbols在链接时“列出”,我不确定如何修复它。它看起来像“#define Base PyBase”行没有完全工作。有什么提示吗?我在这里看到了问题。最简单的答案是在
Base
中创建
cleanupThing
一个完全成熟的虚拟成员函数,并用#define`跳过整个解决方法,抱歉,你能再详细说明一下吗?我的基类中实际上已经有一个viurtal cleanedupThing方法了。但是我应该这样做吗是否删除代码示例第二部分的#define行或所有行?我仍然需要在某个地方实现清理。
virtual void cleanupThing(void* o) {} // Default nothing, not mandatory
void runMe() {
  std::cerr << "Getting object\n";
  void *result = getObject();
  std::cerr << "Got: " << result << "\n";
  doSomething(result);
  std::cerr << "Second time\n";
  doSomething(result);
  std::cerr << "Did a thing\n";
  cleanupThing(result);
}