Tag: python c api

错误:’PyObject’(又名’_object’)类型的值不能在上下文中转换为’bool’

我将一个python模块传递给C作为PyObject 。 我想使用以下表单检查我的C代码中的值是否为NONE: int func(PyObject tmp) { if(tmp) { // etc 我收到以下错误。 我如何从PyObject转换为布尔值,simillar转换为Python函数的行为方式。 值得注意的是,当tmp是boost::python::object变量时,此命令按预期工作。 ex_program.cpp:72:7: error: value of type ‘PyObject’ (aka ‘_object’) is not contextually convertible to ‘bool’ if (tmp) ^~~

将C模块与Python 3.7链接。 在Windows中使用CMake

我正在尝试创建一个可以从Python调用的C库,到目前为止我已经创建了暴露模块信息和方法表的代理C文件(为简单起见,只添加了一个方法get_cycle_count ,其实现无关紧要): static PyMethodDef NESulator_methods[] = { {“NESulator”, get_cycle_count, METH_VARARGS, “Retrieves the current cycle count”}, {NULL, NULL, 0, NULL} /* Sentinel */ }; static struct PyModuleDef NESulator_module = { PyModuleDef_HEAD_INIT, “NESulator”, /* name of module */ NULL, /* module documentation, may be NULL */ -1, /* size of per-interpreter state of the module, or -1 […]

嵌入C语言时的Python语法错误

我有一个python文件,当我对我的python解释器执行它时运行正常。 我正在尝试使用python C API从C程序调用相同的文件: #include #include int main(int argc, char* argv[]){ FILE* fp; Py_SetProgramName(argv[0]); Py_Initialize(); PySys_SetArgv(argc, argv); fp = fopen(“floatcli.py”, “r”); PyRun_SimpleFile(fp, “floatcli.py”); Py_Finalize(); } 但是,当我运行这个时,我得到一个python语法错误: File “floatcli.py”, line 1 üBa ^ SyntaxError: invalid syntax (在这里没有显示的BBa中还有一个装在盒子里的?)。 floatcli.py的第一行只是一个导入语句……任何想法是怎么回事?

试图写入在C扩展中创建的Numpy数组时的SegFault

我在for循环中有一个if子句,我在其中预先定义了state_out: state_out = (PyArrayObject *) PyArray_FromDims(1,dims_new,NPY_BOOL); 如果条件是这样的: if (conn_ctrdata + i*state_out->strides[0]) = true; } else { *(state_out->data + i*state_out->strides[0]) = false; } 将这些注释掉时,state_out将返回all-False Numpy数组。 我没看到这个任务有问题。 据我所知,在此代码中调用的结构PyArrayObject中的所有内容都是指针,所以在指针运算之后,它应该指向我打算写的地址。 (如果代码中的条件是通过以这种方式达到值来构建的,并且我知道它有效,因为我设法打印输入数组的值。)然后,如果我想将bool分配给内存中的其中一个部分,我应该通过*(pointer_intended) = true分配它我错过了什么? 编辑:我发现,即使我将一些printf函数放入其中,即使我没有达到这些值: if (conn_ctr<sum*2){ printf("True!\n"); } else { printf("False!\n"); } 我再次获得了SegFault。 非常感谢,其余代码就在这里。 #include #include “numpy/arrayobject.h” #include #include static PyObject* trace(PyObject *self, PyObject *args); static char doc[] = […]

初始化程序不是常量,错误C2099,编译用c编写的用于python的模块

我试图编译一个名为distance的python模块,在Windows 10上使用msvc 2017编译“python setup.py install –with-c”,我收到此错误, Cdistance / distance.c(647):错误C2099:初始化器不是常量 Cdistance / distance.c(689):错误C2099:初始化器不是常量 错误:命令’C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.10.25017 \ bin \ HostX64 \ x64 \ cl .exe’失败,退出状态为2 这是第647行的代码 646 PyTypeObject IFastComp_Type = { 647 PyVarObject_HEAD_INIT(&PyType_Type, 0) 648 “distance.ifast_comp”, /* tp_name */ 649 sizeof(ItorState), […]

编译多个模块时,import_array()出现Numpy / CAPI错误

我正在尝试编译一个C ++模块,用于scipy.weave ,它由几个头文件和源C ++文件组成。 这些文件包含广泛使用Numpy / C-API接口的类和方法。 但我没有弄清楚如何成功地包含import_array() 。 过去一周我一直在努力解决这个问题,我很疯狂。 我希望你可以帮助我,因为weave 帮助不是很清楚。 在实践中,我首先有一个名为pycapi_utils的模块,它包含一些用C对象与Python对象接口的例程。 它pycapi_utils.h文件pycapi_utils.h和源文件pycapi_utils.cpp例如: //pycapi_utils.h #if ! defined _PYCAPI_UTILS_H #define _PYCAPI_UTILS_H 1 #include #include #include #include #include typedef std::tuple pykeyval; //Tuple type (string,Pyobj*) as dictionary entry (key,val) typedef std::list kvlist; //Declaration of methods PyObject* array_double_to_pyobj(double* v_c, long int NUMEL); //Convert from array to Python list […]

将带有hex值的符号常量添加到Python扩展模块

我在头文件中定义了一些值作为符号常量: #define NONE 0x00 #define SYM 0x11 #define SEG 0x43 … 这些值的名称代表某种类型的数据。 现在,在我目前的模块实现中,我将所有这些符号链接放入一个数组中 static unsigned char TYPES[] = { NONE, SYM, SEG, …} 并将数组中类型的位置添加为模块中的int常量。 PyMODINIT_FUNC initShell(void) { PyObject *m; m= Py_InitModule3(“Sample”, sample_Methods,”Sample Modules”); if (m == NULL) return; … PyModule_AddIntConstant(m, “NONE”, 0); PyModule_AddIntConstant(m, “SYM”, 1); PyModule_AddIntConstant(m, “SEG”, 2); … } 在调用函数时,我必须执行以下操作: static PyObject *py_samplefunction(PyObject *self, […]

在初始化时嵌入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解释器中打印变量

我编写了一个嵌入Python的小程序。 我正在使用Py_Initialize()和Py_Finalize()正确设置它,并且能够使用PyRun_SimpleString或PyRun_SimpleFile运行脚本。 但是,我不知道在打印变量时如何模仿Python自己的解释器的行为。 特别: a = (1, 2, 3) print a 适合我的工作:打印出来(1,2,3) 然而: a = (1, 2, 3) a 什么都没打印出来。 在Python自己的解释器中,这也会打印出(1,2,3)。 如何让我的代码执行用户期望的操作并打印出值? 提前致谢!