将不同的 "C "函数与指针式数组作为函数参数传递给一个类
我正在尝试将以指示作为参数的不同函数传递给Python函数.输入函数作为输入参数的一个示例是给定的normal函数: sample.pyx from cpython cimport array import cython import ctypes cimport numpy as np cpdef void normal(np.ndarray[ndim=1, dtype=np.float64_t] u, np.ndarray[ndim=1, dtype=np.float64_t] yu, np.ndarray[ndim=1, dtype=np.float64_t] ypu): cdef int i cdef int n=len(u) for i in prange(n, nogil=True): yu[i]=-u[i]*u[i]*0.5
6 2024-04-10
编程技术问答社区
混乱的引用所有权:如何正确地去分配(通过Py_DECREF)一个对象的对象?
我正在分析以下代码,该代码编译和运行正确,但会生成内存泄漏. cfiboheap是fibonacci堆的C实现,以下代码是cfiboheap的Cython包装器(其中一部分). 我的疑问始于插入功能.对象data已在某个地方创建并传递到函数insert().由于该函数希望将此对象添加到fiboheap中,因此增加了参考数.但是之后?所有权是谁?在我的理解中,C函数fh_insertkey()只是借用了所有权.然后,它返回了需要不确定的专有指针,然后由insert()返回.凉爽的.但是我的对象data及其裁判计数?通过创建胶囊,我正在创建一个新对象,但我并没有减少data的REF计数.这会产生内存泄漏. (请注意,在返回insert()之前注释Py_INCREF或添加Py_DECREF导致分割错误.) 我的问题是: 1)为什么有必要在insert()期间增加data的ref计数? 2)为什么不必在extract()? 期间使用Py_DECREF 3)
10 2024-04-09
编程技术问答社区
使用cython从C语言中调用带有Python导入的Python文件
这个问题基于捻.我想使用Cython编译Python函数,然后将其称为C.在此简单的情况下,它有效,但是当我尝试从Python代码导入另一个Python模块时,它不起作用. world.pyx def world(): return 10 hello.pyx import world def hello(): ret = 5 + world() return ret cdef public int call_hello(): return hello() main.c #include #include "hello.h" int main() { Py_Initialize(); PyInit_hello(); int v = call_hello(); printf("the value is %d\n",v); Py_Finalize(); return 0; }
6 2024-04-09
编程技术问答社区
返回一个指向Python数组的2D Cython指针
我目前正在从Cython传递到C的以下指针: #convert the input Python 2D array to a memory view cdef double[:,:] a_cython= np.asarray(a,order="C") #define a pointer of a pointer with dimensions of a cdef double** point_to_a = malloc(N * sizeof(double*)) #initialize the pointer if not point_to_a: raise MemoryError #try: for i in range(N): point_to_a[i] = &a_cython[i, 0] #pass this double pointer to a C functio
28 2024-04-09
编程技术问答社区
从C语言调用Python
我有一个C代码,并且有一些简单的文件操作我需要在初始化目的开始时需要进行,这对于Python来说很简单.我想知道是否有一种方法可以从C中打电话给Python.我熟悉从Python打电话C,但是对于Cython可以做的相反,我可以做到这一点,但是我对如何. 我感到非常困惑. Python代码必须输入一些字符串,进行一些文件操作并返回一些双打和数组. 解决方案 要从C调用Python,这很简单.首先,您需要安装python-dev软件包才能访问python.h文件.然后,您可以访问Python API.这是API的参考: https://docs.python.org/2/C-api/intro.html .特别注意嵌入python部分.基本过程是调用py_initialize()执行您的python代码,然后致电py_finalize()
6 2024-04-09
编程技术问答社区
阻止sys.stdout和stderr不会阻止C代码打印
我在我的python代码中包含了通过Cython包装器在c中编译的功能.我必须将该功能作为给定,不能更改它.不幸的是,当我运行该功能时,我会看到困扰我的输出. 我尝试了很多应该摆脱它的技巧,所有这些都用sys.stdout或sys.stderr播放 - 最不明白的是新的contextlib.redirect_stdout.但是,我没有尝试过沉默输出. 在最基本的层面上,我只是尝试设置 sys.stdout = open(os.devnull, 'w') sys.stderr = open(os.devnull, 'w') 这不是一种安全或可行的方法,但应该关闭功能.不幸的是,我仍然可以看到输出.我想念什么?除了stdout之外,还有另一个"输出类型"可能正在使用? 如果有帮助,我在Pycharm调试会话中,并在调试控制台中查看此输出. 更新的问题以反映更改stderr没有帮助 解决方案 一个C函数打印到文件描述符(sTdout 1
18 2024-04-09
编程技术问答社区
Py_InitModule4()在嵌入式Python |解释器上返回NULL(与Cython一起)。
我正在使用Cython编写C-Plugin.在决赛中,这应该将Python Interpreter嵌入Windows上的iTunes中.为了使此工作,请 boottrapper 需要.它实现了iTunes插件的入口点,初始化或最终确定或任何需要的内容,然后调用Cython生成的代码. 我正在使用 mingw gcc 4.6.2 on Windows 7 64bit 和 cpython 2.7 . 序言 Windows上的iTunes插件入口点称为iTunesPluginMain.据我所知,实现该插件的共享库是 始终保持iTunes正在运行的时间,因此,一旦进入输入 - 点叫.这就是为什么iTunes希望开发人员存储void*指针到将每个调用传递给iTunesPluginMain的句柄的指针. iTunesPluginMain被称为几个通知,例如初始化和清理. Bootstrapper看起来像这样: /** coding: utf-8 file:
6 2024-04-09
编程技术问答社区
用MinGW-undefined reference PyExc编译Cython
我正在尝试从" 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
14 2024-04-09
编程技术问答社区
如何将自定义C语言(其本身需要特殊的链接选项来编译)与Cython链接?
因此,我正在尝试创建一个使用我编写的.c文件的Cython模块.那个.c文件需要一个特殊的链接选项(要编译它,我需​​要gcc -o mycode mycode.c -lfftw3f).我可能只需在Cython中重写我的.c文件,但是我想知道如何做. 我正在使用fftw3,并且在编译时,如果要使用float版本,则需要在.c文件中使用-lfftw3f>选项. 我的setup.py看起来如下: from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourcefiles = ['mycode_caller.pyx', 'mycode.c'] ext_modules = [Extension("myext", sourcefiles, libraries=['fttw3f'])] setup(
10 2024-04-09
编程技术问答社区
在cython中使用typedef'd结构
我在标题文件DCM.H中具有以下定义: typedef struct { double alpha; double gamma; double tau; } ThetaDCM; 我想在Cython中导入它,所以我有: cdef extern from "dcm.h": ctypedef struct ThetaDCM: np.float64_t alpha np.float64_t gamma np.float64_t tau 现在,我想将内存分配给thetadcm的数组.我有以下内容: cdef ThetaDCM *c_theta = malloc(nt * nb * sizeof(ThetaDCM)) free(c_theta) 这没有编译并报告以下错误: error: ‘ThetaDCM’ undeclared (first u
4 2024-04-09
编程技术问答社区
在C代码中调用Python函数
我编写了小型代码,例如python中的两个数字. addition.py def add(a,b): c=a+b print "result is...",c mainpgm.c ??? 如何调用c(mainpgm)程序中的添加/add函数. 我已经看到了一些链接,但我不明确. 在c. 中调用该功能的任何建议 解决方案 阅读 Python手册, #include int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("import addition\naddition.add(42, 42)\n"); Py_Finalize(); return 0; } 可能会做您
2 2024-04-09
编程技术问答社区
用C函数扩展Numpy
我正在尝试加快我的numpy代码,并决定我想实现一个特定的功能,而我的代码大部分时间都花在c. 中 我实际上是C中的新秀,但是我设法编写了将矩阵中的每一行归一般到1的函数,我可以对其进行编译,并用一些数据(在C中)对其进行了测试,并且它可以做什么我想.那时我为自己感到非常自豪. 现在,我试图从Python调用我的光荣功能,在那里它应该接受一个2D-umpy数组. 我尝试的各种事情是 swig swig + numpy.i ctypes 我的功能具有原型 void normalize_logspace_matrix(size_t nrow, size_t ncol, double mat[nrow][ncol]); 因此,它需要指向变量长度数组并将其修改为适当的指针. 我尝试了以下纯Swig接口文件: %module c_utils %{ extern void normalize_logspace_matrix(size_t
18 2024-04-09
编程技术问答社区
如何在Cython中强制使用长倍数?
对于我对C的知识不足,我先前道歉:我使用python来编码,并使用标准C函数为Cython编写了一些模块,以实现速度的大幅提高.但是,我需要一个大于1e308(是的,您正确阅读),这是我当前使用type double complex和功能cexp和cabs. 来获得的. 我尝试使用函数cexpl和cabsl,并将我的变量声明为类型long double complex,但是在1e308之后我仍然遇到溢出.这可能意味着我的编译器将长双打转换为双打,对吗?但是根据维基百科的说法, 使用GNU C编译器,Long Double是X86处理器上的80位扩展精度,无论该类型使用的物理存储如何(可以是96或128位).[4] 我正在使用Arch Linux的64位系统(如果很重要,则使用Python 2.7.8). 如何编写一个迫使使用长双打的Cython模块?我需要这么大的数字来进行一些科学计算. 编辑: 用标志-M128Bit-Double编译给出相同的结果.如所
12 2024-04-08
编程技术问答社区
Cython。从C程序中调用Python代码
我正在尝试制作Cython包装器,以便我可以从C中调用Python代码. 下面的代码在调用导入函数时以 segfault 结束.如果代码写为python模块并通过import导入,则该程序说name ... is not defined.当所有内容都在一个文件中并且不涉及导入时,这个问题不会表现出来(实际上Cython生成的代码在Cimporting时会失败).从其他Python脚本导入LibCimpy.pyx(编译为.SO或LIVE) 时,该代码也可以正常运行. 我准备了一个最小的例子.这远非实际代码,但涵盖了原则. cimppy.pyx:样品python代码(转换为Cython) cdef sum(a, b): return a + b cimppy.pxd cdef sum(a, b) libcimpy.pyx(胶Cython代码) cimport cimpPy cdef public int cSum(int a, int b):
12 2024-04-08
编程技术问答社区
Python运行时:重新编译和重复使用C库
我正在开发一种工具,用于对用户定义功能的一些数值分析. 这个想法是在Python中制作一个方便的UI,用户可以输入C函数,然后按下按钮 - 并接收一些输出数据. 计算可能需要几分钟或数小时,因此不可接受的性能是不可接受的. 我尝试了以下方法:基于Python的UI调用GCC,从用户函数中编译DLL,这些功能比我的Core C算法在Cython包装中使用的dll.它有效,但是由于无法完全卸载Python模块,因此在整个UI程序被关闭并再次运行之前,我无法重新编译用户定义的功能. 我现在看到的唯一方法是将计算核心和UI进程分开,然后通过共享内存/消息使它们进行交互.当用户想更新他的功能时,该程序终止了核心,重新编译DLL并再次启动核心. 在这种情况下,您可以建议任何常见的做法吗? 谢谢! 解决方案 python确实很好 suppertrocessing support support 真的不是很好支持),因此您可以产生一个新的Python过程,以评估每个表达式
8 2024-04-08
编程技术问答社区
Python distutils拒绝识别已安装的C++编译器,`在Python 3.5下无法找到vcvarsall.bat`。
我将头发撕开,试图通过python的dist脚来编译C.具体来说,我试图从Cython开始遵循本指南:我在Anaconda 2.4.0(64位)下运行Python 3.5.0,Windows 7. 我在此处获取Unable to find vcvarsall.bat错误:在运行python脚本时找不到vcvarsall.bat 和其他各种问题. 所提出的解决方案都不适合我.到目前为止,我已经尝试过: 安装Visual Studio-我拥有2008年至2013年的所有版本,即9.0、10.0、11.0和12.0. 指向环境变量(VS100COMNTOOLS等)与以上直接相关的位置 为Python安装Microsoft Visual C ++编译器(如上所述).这似乎有效,但我遇到了一个汇编错误,这似乎是不相容的.我认为,因为编译器的目的是用于Python 2.7. 拉维·库马尔(Ravi Kumar)在上述链接上的建议,以更新Pip的setuptools. PIP给
10 2024-04-08
编程技术问答社区
用C语言头文件编译Cython出错
所以我试图用Cython包装一些C代码.我阅读了有关此操作的Apply Cython的教程(首先,我的Cython脚本(" Calcrmsd.pyx"): import numpy as np cimport numpy as np cdef extern from "rsmd.h": double rmsd(int n, double* x, double* y) #rest of the code ommited 我正在尝试包装的C代码(" rmsd.h"): #include #include #include #include extern "C" { // svd from lapack void dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,
8 2024-04-08
编程技术问答社区
如何释放与Cython模块对接的外部C库分配的内存,其中内存最终会返回到Python进程中?
我是Cython的崭新,但基本上我有此应用程序需要大幅提高,因此我和我的团队正在尝试重写我们在Cython和C. 中的瓶颈 对于我们应用程序最慢的部分,我编写了一些C代码,这些C代码被编译到库中,cdef extern导入到Cython模块中,我认为这是.pyx文件.从本质上讲,pyx文件中的代码基本上只是一个包装器,它返回了C库功能的呼叫.最后,有一个Python进程(主要应用程序),该过程导入pyx文件中定义的所有函数并使用这些结果. 我相信我有内存泄漏,因为在C代码中,我需要传递给Python过程的结果有时会动态分配.我的问题是,一旦Python过程使用它,我就不知道如何释放此内存. 示例python代码 from examplecython import * def foo(data): context = data.context value = call_pyx_function(context, data) return va
12 2024-04-08
编程技术问答社区
如何让c printf在ipython笔记本的cython单元中打印?
%%cython from libc.stdio cimport printf def test(): printf('abc') 如果我运行test(),它没有打印任何东西. 目前我正在做一些愚蠢的事情: cdef char s[80] sprintf(s, 'something') print s 在Cython中使用printf的更好方法是什么?为什么不打印? 解决方案 您可以使用例如,在jupyter笔记本中包括以下代码块: %load_ext Cython %load_ext wurlitzer %%cython from libc.stdio cimport printf def test(): printf('abc') test() # prints "abc" 其他解决方案 输出将在运行jupyter笔记本的终端(控制台)中打印.不确定如何在jupyter中显示.
20 2024-04-08
编程技术问答社区
由于未知的类型名称'uint64_t',Cythonizing失败。
这可能是一个新手问题.我不能简单的helloworld.pyx教程脚本,而该代码完全相同的代码在Linux上工作: print("hello world") 这是setup.py脚本: from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('helloworld.pyx')) 但是我在运行python setup.py build_ext --inplace之后得到了这个: running build_ext building 'helloworld' extension creating build creating build/temp.macosx-10.7-x86_64-3.6 gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -
14 2024-04-08
编程技术问答社区