包装方法
从 Python 类中调用相关的 C++ 类方法很简单:
-
PyObject* MyClass_addOne(PyObject *self, PyObject *args){
-
assert(self);
-
-
MyClassObject* _self = reinterpret_cast(self);
-
unsigned long val = _self->m_myclass->addOne();
-
return PyLong_FromUnsignedLong(val);
-
}
同样,
PyObject
参数(self
)被强转为MyClassObject
类型以便访问m_myclass
,它指向 C++ 对应类实例的指针 。有了这些信息,调用addOne()
类方法,并且结果以 docs.python.org 返回 。3 种方法调试
出于调试目的,在调试配置中编译 CPython 解释器是很有价值的 。详细描述参阅 docs.python.org 。只要下载了预安装的解释器的其他调试符号,就可以按照下面的步骤进行操作 。
GNU 调试器
当然,老式的 opensource.com 也可以派上用场 。源码中包含了一个 github.com 文件,定义了一些选项和断点,另外还有一个 github.com 脚本,它会创建一个调试构建并启动一个 GDB 会话:
文章插图
Gnu 调试器(GDB)对于 Python C 和 C++ 扩展非常有用
GDB 使用脚本文件 github.com 调用 CPython 解释器,它允许你轻松定义你想要使用 Python 扩展模块执行的所有操作 。
C++ 应用
另一种方法是将 CPython 解释器嵌入到一个单独的 C++ 应用程序中 。可以在仓库的 github.com 文件中找到:
-
int main(int argc, char *argv[], char *envp[])
-
{
-
Py_SetProgramName(L"DbgPythonCppExtension");
-
Py_Initialize();
-
-
PyObject *pmodule = PyImport_ImportModule("MyModule");
-
if (!pmodule) {
-
PyErr_Print();
-
std::cerr << "Failed to import module MyModule" << std::endl;
-
return -1;
-
}
-
-
PyObject *myClassType = PyObject_GetAttrString(pmodule, "MyClass");
-
if (!myClassType) {
-
std::cerr << "Unable to get type MyClass from MyModule" << std::endl;
-
return -1;
-
}
-
-
PyObject *myClassInstance = PyObject_CallObject(myClassType, NULL);
-
-
if (!myClassInstance) {
-
std::cerr << "Instantioation of MyClass failed" << std::endl;
-
return -1;
-
}
-
-
Py_DecRef(myClassInstance); // invoke deallocation
-
return 0;
-
}
使用 docs.python.org,可以导入扩展模块并对其执行操作 。它允许你在本地 IDE 环境中进行调试,还能让你更好地控制传递或来自扩展模块的变量 。
推荐阅读
- Python 教你快速批量下载抖音去水印短视频
- 为什么我抓不到baidu的数据包?
- Python破解24点游戏
- 为什么Java线程没有Running状态?
- 一次服务器沦陷为肉鸡后的排查过程
- 国外大学生用AI写论文,还次次拿到A
- 为什么短短两周之后就鲜有人继续讨论ChatGPT了?
- 开发一个简单的热搜微信小程序
- 戚薇|戚薇二胎产后首露面,发长文卖惨为月子中心打广告,网友:快封杀
- 为什么有些腕表被称为医生表?