Tag: cython

使用MinGW编译Cython – 未定义的引用PyExc

我正在尝试从“Cython – Python程序员指南”一书中编译一个简单的代码片段,当我编译时,我收到以下错误: H:\Cython>python setup.py build_ext -i –compiler=mingw32 running build_ext building ‘fib’ extension C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Anaconda3\include -IC:\Anaconda3\include -c fib.c -o build\temp.win32-3.4\Release\fib.o writing build\temp.win32-3.4\Release\fib.def C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-3.4\Release\fib.o build\temp.win32-3.4\Release\fib.def -LC:\Anaconda3\libs -LC:\Ana conda3\PCbuild -lpython34 -lmsvcr100 -o H:\Cython\fib.pyd build\temp.win32-3.4\Release\fib.o:fib.c:(.text+0xb6): undefined reference to `_imp__PyExc_TypeError’ build\temp.win32-3.4\Release\fib.o:fib.c:(.text+0xf3): undefined reference to `_imp__PyExc_TypeError’ build\temp.win32-3.4\Release\fib.o:fib.c:(.text+0x3cc): undefined reference to `_imp___PyThreadState_Current’ build\temp.win32-3.4\Release\fib.o:fib.c:(.text+0x857): undefined reference […]

在Cython中返回一个结构数组

我试图在Cython中返回一个结构数组。 // .pyx from libc.stdint cimport uint8_t cdef extern from “”: cdef struct apriltag_detection: int id double c[2] double p[4][2] ctypedef apriltag_detection apriltag_detection_t cdef extern from “tag36h11_detector/tag36h11_detector.h”: apriltag_detection_t* scan_frame(int width, int height, uint8_t* data); cdef class Detection: # how do I “link” this to the struct defined above? def __cinit__(self): pass def __dealloc__(self): pass def […]

从C调用Python

我有一个C代码,并且有一些简单的文件操作,我需要在开始时进行初始化,这对于Python来说是很简单的。 我想知道是否有办法通过从C调用python来做到这一点。我熟悉从Python调用C,但是为了做相反的事情我已经读过Cython可以做但我对如何做很困惑。 python代码必须输入一些字符串,进行一些文件操作并返回一些双精度和数组。

通过cython将python字符串传递给C语言

我正在尝试编写一个带有一些c和一些python部分的模块。 我正在使用cython弥补差距。 我想在python中存储我的(非常长的)字符串常量,因为它的语法更好: const char long_string = “\npart of string\n” “next part\n” “last part\n”; 与: long_string = “”” part of string next part last part “”” (字符串比这长得多,而且更复杂 – 我不想每次想要用语法高亮来编辑它时都要添加和删除” s和\n” 。事实上,它们是openCL内核。) 我需要能够使用cython将它们变成c字符串,根据文档我应该只需要: cdef bytes py_bytes = py_string.encode() cdef char* c_string = py_bytes 并且没有手动内存管理,只要我保留对py_bytes的引用, c_string就会起作用。 但是,我无法通过简单的printf测试来实现这一点。 这是我的cython文件: cdef extern from “stdio.h”: printf(char* string) def go(): py_string […]

读入大文件并制作字典

我有一个大文件,我需要阅读并从中制作字典。 我希望这个尽可能快。 但是我在python中的代码太慢了。 这是一个显示问题的最小示例。 首先制作一些假数据 paste <(seq 20000000) largefile.txt 现在这里有一段最小的python代码来读取它并制作一本字典。 import sys from collections import defaultdict fin = open(sys.argv[1]) dict = defaultdict(list) for line in fin: parts = line.split() dict[parts[0]].append(parts[1]) 时序: time ./read.py largefile.txt real 0m55.746s 但是它不是I / O绑定的: time cut -f1 largefile.txt > /dev/null real 0m1.702s 如果我注释掉dict行,则需要9秒。 似乎几乎所有的时间都花在了dict[parts[0]].append(parts[1]) 。 有什么方法可以加快速度吗? 我不介意使用cython甚至C,如果这会产生很大的不同。 或者pandas可以在这帮忙吗? 以下是大小为10000000行的文件的配置文件输出。 python […]

将Cython中的numpy数组传递给需要动态分配数组的C函数

我有一些C代码具有以下声明: int myfunc(int m, int n, const double **a, double **b, double *c); 所以a是一个常数的二维数组, b是一个二维数组, c是一维数组,都是动态分配的。 b和c在传递给myfunc之前不需要任何具体的东西,应该被理解为输出信息。 出于这个问题的目的, 我不允许更改myfunc的声明。 问题1:如何将给定的numpy数组a_np转换为具有此C函数所需格式的数组a ,以便我可以在Cython中使用?调用此C函数? 问题2:下面的b和c的声明是否正确,或者它们是否需要采用其他格式才能使C函数将其理解为2D和1D数组(分别)? 我的尝试: myfile.pxd cdef extern from “myfile.h”: int myfunc(int p, int q, const double **a, double **b, double *c) mytest.pyx cimport cython cimport myfile import numpy as np cimport numpy as np p = […]

使用Cython向另一个应用程序公开function

我有这个C ++代码,它显示了如何通过将软件编译为DLL并将其放在应用程序文件夹中来扩展软件: #include #include /** A helper function to convert a char array into a LPBYTE array. */ LPBYTE message(const char* message, long* pLen) { size_t length = strlen(message); LPBYTE mem = (LPBYTE) GlobalAlloc(GPTR, length + 1); for (unsigned int i = 0; i < length; i++) { mem[i] = message[i]; } *pLen = length […]

cython分段故障处理

我正在包装一些C库,我有一个function,在某些情况下可能导致分段错误。 在这种情况下,我需要调用第二个函数,在这种情况下将成功完成。 有谁知道如何处理cython中的分段错误?

如何将Cython生成的模块从python导入到C / C ++主文件? (用C / C ++编程)

所以我有一个用python编写的函数,我按照Cython文档“使用distutils构建一个Cython模块”中的步骤进行操作。 但是,我不清楚如何使用在python中工作的模块(通过导入它)嵌入到C / C ++中? 我只想编译一个使用Cython导入python生成模块的C / C ++代码(我想这是一个两步过程) *为了澄清,我已经完成了所有步骤并从.pyx源文件创建了一个python模块。 但我的问题是如何将该模块集成到现有的C / C ++文件中。

获取Cython指针的值

我正在编写一个函数,构造一个malloc’d unsigned char *数组,然后返回指针。 在纯Cython或C中,这很容易。 您所要做的就是在函数上设置返回类型,并将指针返回到数组。 完成。 但是,我已经达到了一个点,我需要将一个指向Cython中创建的数组的指针返回给Python。 我知道指针只是内存地址。 有没有什么方法可以返回一个Python的Python指针作为python对象(如int或hex,因为内存地址本质上是一个数字),所以我可以基本上管理python中的指针? 我试图像这样返回指针的值: cdef unsigned char array[8] def return_pointer(): return &array 这当然不起作用,因为转换不能完成。 Cython抱怨Cannot convert ‘unsigned char (*)[8]’ to Python object 。 有什么建议? 编辑: 我不需要访问Python中指针引用的内存地址中的值,只需传递指针。 然后我计划使用Python对象指针,并用它作为参数调用c函数。