Python ctypes .dll 函数(pari 库)

标签 python ctypes pari

好吧,所以a couple days ago我决定尝试为 PARI 库编写一个原始包装器。从那时起,我一直在使用 ctypes 库加载 dll 并使用类似于以下的代码访问所包含的函数:

from ctypes import *
libcyg=CDLL("<path/cygwin1.dll") #It needs cygwin to be loaded. Not sure why.
pari=CDLL("<path>/libpari-gmp-2.4.dll")

print pari.fibo #fibonacci function
#prints something like "<_FuncPtr object at 0x00BA5828>"

所以这些函数就在那里,并且可以访问它们,但无论我尝试什么,我总是收到访问冲突。例如:

pari.fibo(5) #access violation
pari.fibo(c_int(5)) #access violation

pari.fibo.argtypes = [c_long] #setting arguments manually
pari.fibo.restype = long #set the return type

pari.fibo(byref(c_int(5))) #access violation reading 0x04 consistently

以及与之相关的任何变体,包括设置argtypes来接收指针。

Pari .dll 是用 C 语言编写的,库中斐波那契函数的语法为 GEN fibo(long x)

是否是返回类型导致了这些错误,因为它不是标准 intlong 而是 GEN 类型,是 PARI 图书馆独有的吗?任何帮助,将不胜感激。如果有人能够成功加载该库并使用 python 中的任何函数,请告诉;我已经花了几个小时了。

编辑:似乎我只是忘记初始化库。快速 pari.pari_init(4000000,500000) 后,错误停止了。现在我的问题在于它返回一个 GEN 对象;这很好,但每当我尝试引用它指向的地址时,它总是 33554435,我认为它仍然是一个地址。我正在尝试更多命令,如果我成功获得某些内容的正确值,我将进行更新。

最佳答案

这里有两个问题,一是为 fibo 提供正确的返回类型,二是将 GEN 返回类型转换为您要查找的值。

稍微浏览一下源代码,您会发现 GEN 被定义为指向 long 的指针。另外,看起来该库提供了一些转换/打印 GEN。我专注于 GENtostr,因为它对于所有 pari 函数来说可能更安全。

import cytpes
pari = ctypes.CDLL("./libpari.so.2.3.5") #I did this under linux
pari.fibo.restype = ctypes.POINTER(ctypes.c_long)
pari.GENtostr.restype = ctypes.POINTER(ctypes.c_char)    
pari.pari_init(4000000,500000)
x = pari.fibo(100)
y = pari.GENtostr(x)
ctypes.string_at(y)

结果:

'354224848179261915075'

关于Python ctypes .dll 函数(pari 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527705/

相关文章:

python - 在截止时间后锁定操作投票,在 Django 中编辑投票实例时解锁

python - 在 Jupyter Notebook 中使用 Ctypes

Pari C 中 t_REAL 的自定义精度位

perl 在 @INC 中找不到模块 Math::Pari 的可加载对象

pari - 从 PARI/GP 复制号码

python - Bash:WAITING后台python进程

python - 在运行时切换 TG2 中的数据库

python - 将高斯曲线拟合到python中的数据

python - 从共享库中获取枚举定义

Python Ctypes 读取从 C++ dll 返回的 char*