如何将 C++ 对象转换为 PyObject?
Posted
技术标签:
【中文标题】如何将 C++ 对象转换为 PyObject?【英文标题】:How do you convert a C++ object to a PyObject? 【发布时间】:2012-11-29 09:23:55 【问题描述】:我有两个 c++ 对象
int queueIndex
Timer timer_obj
这里是定时器类的定义
class Timer
private:
struct timeval tStart; /**< @brief Stores the system time when the timer is started */
struct timeval tFinish; /**< @brief Stores the system time when the timer is stopped */
protected:
float getElapsedTime(struct timeval, struct timeval);
public:
Timer();
string currentTime();
float currentElapsedTime();
void restart();
float stop();
int high_pres_usleep_untill(unsigned long long int);
string getStringStartTimer();
void setStartTimerFromString(string);
void sleep(long int);
unsigned long long int get_clock();
我需要将这两个对象转换为 PyObj*。我为此使用了 boost::python。我现在希望在没有 boost 或 swig 的情况下这样做。 我成功地转换了索引,但我对 timer_obj 毫无头绪
PyObject* pyo=PyInt_FromLong(queueIndex)
如果有人可以帮助我,我将不胜感激。我只需要一个示例,您不需要给我完整的代码。而且类中定义的函数有点复杂,所以我没有在这里给出它们。是可以转换 timer_obj 然后分配一个新的引用,还是我必须为类中的所有结构和函数获取新引用并使用这些引用创建一个新类?
【问题讨论】:
在问题本身中发布此内容 您究竟想通过“转换 C++ 对象”来完成什么?boost::python
是为了实现互操作性,所以我假设您想用 Python 代码使 C++ 应用程序“可扩展”,对吧?也许cython.org 可以帮助你?
嗯,我正在开发用 c++ 编写的客户端到服务平台,以及服务必须用 python 编写的逻辑。直到现在我一直在使用 boost,但最近我被要求更改解释器我不能再使用 boost 的方法
【参考方案1】:
您需要做的是创建一个extension type。不幸的是,这个过程相对复杂,需要几百行代码。这就是 boost::python 和 SWIG 的全部 python,用于删除所有样板。
【讨论】:
目前在 Py 脚本中我只需要函数 getElapsedtime()。是否有可能在不完全转换计时器对象的情况下检索它 如果只需要一个函数,可以创建一个CObjectdocs.python.org/2/c-api/cobject.html。这基本上会让你将一个不透明的 void 指针传递给 python。然后,您可以将getElapsedTime()
公开为将您的 CObject 作为参数的函数。 (您还需要创建一个以某种方式生成这些 CObject 的函数,以便您可以将它们传递给 python)。【参考方案2】:
正如 Nathan 所说,扩展类型是相对涉及的。您想为此探索 Cython,因为语法更简单,并且它负责在内部生成样板。 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html
您也可以查看 Niklas 在https://***.com/a/8933819/2156678 中发布的示例
【讨论】:
以上是关于如何将 C++ 对象转换为 PyObject?的主要内容,如果未能解决你的问题,请参考以下文章
从 C++ 函数 Cython 返回包含 PyObject 的复杂对象