python和C++联合调试
2023-09-27 14:25:09 时间
python可以利用SO的方式去调用C++中的函数,但是需要一种调试方案来进行python和C++的联合调试,效果是直接在c++代码中打断点,然后python在进行c++so调用的时候,直接进入到断点处:
testlib.cpp
#include <python2.7_d/Python.h> using namespace std; PyObject * CFuncEntry(PyObject * self, PyObject *args) { PyObject * datalist = NULL; PyArg_ParseTuple(args, "O", &datalist); int rst = 0; for(int i=0; i < PyList_Size(datalist); ++i){ int val = PyInt_AsLong(PyList_GetItem(datalist, i)); rst += val; } return Py_BuildValue("i", rst); } PyMODINIT_FUNC initCFuncEntry(void) { static PyMethodDef methods[] = { {"CFuncEntry", (PyCFunction)CFuncEntry, METH_VARARGS, "test lib"}, {NULL, NULL, 0, NULL} }; Py_InitModule("CFuncEntry", methods); }
call_cpp.py
#!/usr/bin/python # -*- encoding utf-8 -*- import CFuncEntry if __name__ == "__main__": numberlist = [1,2,3,4,5,6,7] rst = CFuncEntry.CFuncEntry(numberlist) print rst
setup.py
from distutils.core import setup, Extension module1 = Extension('CFuncEntry', define_macros = [('MAJOR_VERSION', '1'), ('MINOR_VERSION', '0'), ('Py_DEBUG', 1)], include_dirs = ['/usr/local/include'], library_dirs = ['/usr/local/lib'], sources = ['testlib.cpp']) setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', author = 'Martin v. Loewis', author_email = 'martin@v.loewis.de', url = 'https://docs.python.org/extending/building', long_description = ''' This is really just a demo package. ''', ext_modules = [module1])
将setup.py和testlib.cpp放到同一个目录下,执行python setup.py install
可以看到CFuncEntry.so已经生成,这时执行gdb –args python-dbg call_cpp.py可以进入到gdb调试模式:
可能的问题:
1. python-dbg有可能没有安装,需要执行sudo apt-get install python-dbg进行安装;
2. 直接使用g++ -o CFuncEntry.so testlib.cpp -g -shared -fpic -DEBUG -lpython2.7_d 的方式生成的so会出现如下错误:
undefined symbol: Py_InitModule4_64
3. 直接用g++进行编译,生成so,需要加上Py_DEBUG参数:g++ -o CFuncEntry.so testlib.cpp -g -shared -fpic -DEBUG -lpython2.7_d -DPy_DEBUG
参考资料:
1. http://hustoknow.blogspot.com/2013/06/why-your-python-program-cant-start-when.html
2. https://blog.csdn.net/mydear_11000/article/details/52252363
相关文章
- 使用setup.py安装python包和卸载python包的方法
- 为什么 Python 没有 main 函数?
- [oeasy]python0022_ python虚拟机_反编译_cpu架构_二进制字节码_汇编语言
- Python 绑定:从 Python 调用 C 或 C++
- Python利用LCU接口实现LOL(英雄联盟)一键载入自定义天赋(符文)
- 【python】pandas 的 apply函数方法 如何获取当前行的行索引
- 【Python开发】Python:itertools模块
- C/C++/C#/Python日志框架
- [转载]c++转python
- VSCode配置python调试环境
- SWIG 和 Python——c/c++与脚本交互
- OpenCV技巧 | 二值图孔洞填充方法与实现(附Python/C++源码)
- 高精度色子 投子 骰子定位识别C++/Python/C# opencv emgucv
- 一行代码实现灰色铅笔画、彩色铅笔画和卡通画效果(C++/Python OpenCV源码)
- C++ Python OpenCV基础与应用视频教程 免费高清视频
- Python / C++ OpenCV计时函数使用备忘
- 黑马程序员 Python学习笔记 之 名片管理系统
- python查看字节码
- Pytorch 学习(9):Python C 扩展( C、C++代码-----C so 代码库------python代码调用)
- PyQt(Python+Qt)学习随笔:QTableWidget的构造方法
- 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
- PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件autoRepeat、autoRepeatDelay、autoRepeatInterval属性
- Python的富比较方法__le__、__ge__之间的关联关系分析
- 超牛逼!Python爬虫学习的完整路线推荐
- c/c++调用python的一些坑,主要是编译问题和版本问题
- gdb同时调试python和c++
- C++多线程中调用python api函数--好文
- 【Python笔记1.2】C/C++多线程调用Python类--好文
- VS2019 C++ 调用python函数/类对象的方法
- Pybinder-python与c++的调用
- 【C++/Python 双语言实现】Luogu5092 Cube Stacking