Tag: python c extension

使用ctypes从Python中获取C中的自定义数据类型的地址

我在C中有一个带有以下字段的vector结构, struct vector { unsigned char* data; unsigned long size; unsigned long elemsize; unsigned long capacity; }; 并且有一些函数相应地对vector实例起作用,例如: struct vector* vector_new(unsigned long elemsize); void vector_delete(struct vector* vec); void vector_push_back(struct vector* vec, void* value, unsigned long elemsize); void vector_reserve(struct vector* vec, unsigned long cap); … 等等(模仿c ++风格的std::vector )。 在我的代码库的其他部分,我有组件结构,例如mirror : struct mirror { double R; double […]

Python C扩展:从引擎中提取参数

我想用Python对我的函数进行数学测试。 可以访问Python的典型程序是: #include #include #include int RunTests() { Py_Initialize(); PyRun_SimpleString(“a=5”); PyRun_SimpleString(“b=’Hello'”); PyRun_SimpleString(“c=1+2j”); PyRun_SimpleString(“d=[1,3,5,7,9]”); //question here Py_Finalize(); return 0; } 我的问题是:如何将参数a,b,c,d提取到PyObject ?

Python C扩展:PyEval_GetLocals()返回NULL

我需要在C / C ++中从Python读取局部变量。 当我尝试PyEval_GetLocals ,我得到一个NULL。 尽管Python已初始化,但会发生这种情况 以下是一个最小的例子。 #include #include Py_Initialize(); PyRun_SimpleString(“a=5”); PyObject *locals = PyEval_GetLocals(); std::cout<<locals<<std::endl; //prints NULL (prints 0) Py_Finalize(); 在手册中 ,它表示如果没有帧正在运行它会返回NULL,但是……正在运行一个帧! 我究竟做错了什么? 我在Debian Jessie中运行它。

在初始化时嵌入python错误

当我运行C代码来调用python函数时,Py_Initialize()上出现错误错误是ImportError:没有名为site的模块。 我试过把Py_SetProgramName(argv [0])但它不起作用。 cmd调用是cInterfacePython Test.py乘以3 2(exe是cInterfacePython)

将C结构传递给Python函数

我需要一种简单的方法将C结构传递给Python函数。 我已经将Python嵌入到游戏服务器中,我打算用Python编写游戏逻辑。 我搜索了谷歌和邮件列表,没有发现任何有用的东西。 我在C中有一个复杂的结构(指向其他相对复杂的结构)并且没有找到合理的方法。 我有这个结构: struct client { int state; int sockfd; struct sockaddr_in *addr; struct epoll_event *epollev; struct buffer *in_buffer; struct buffer *out_buffer; struct packet *packet; struct player *player; }; 并且需要将它传递给Python函数,在那里我可以使用通用语法轻松访问成员(最好不要使用像dicts这样的东西,尽管那也没关系)。 这几乎就像我需要一个PyObject_FromStruct函数。 有没有相对简单的方法来做到这一点?

我怎样才能从Python C代码断言?

我正在用C编写Python类,我想在我的调试代码中加入断言。 assert.h适合我。 这只会放入调试编译中,因此不会有断言失败影响Python代码的用户*。 我试图划分我的’库’代码(它应该与链接到Python的代码分开),所以我可以从其他C代码中使用它。 因此,我的Python方法是我的纯C代码的简洁包装。 所以我不能在我的’库’代码中执行此操作: if (black == white) { PyErr_SetString(PyExc_RuntimeError, “Remap failed”); } 因为这会使用Python污染我的纯C代码。 它也比简单的更丑陋 assert(black != white); 我相信Distutils编译器总是设置NDEBUG ,这意味着即使在调试版本中我也不能使用assert.h 。 Mac OS和Linux。 救命! *我听过一个论点反对在Python中调用C代码断言。

有没有理由在PyMem_Malloc上使用malloc?

我正在阅读Python C扩展中的内存管理文档,据我所知,似乎没有太多理由使用malloc而不是PyMem_Malloc 。 假设我想分配一个不会暴露给Python源代码的数组,并将存储在一个将被垃圾回收的对象中。 有没有理由使用malloc ?