好的,所以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编写,库中fibonacci函数的语法为GEN fibo(long x)

可能是导致这些错误的返回类型,因为它不是标准的intlong而是GEN类型(对于PARI库是唯一的)?任何帮助,将不胜感激。如果有人能够成功加载库并在python中使用ANY函数,请告知;我已经在这里呆了几个小时了。

编辑:似乎我只是在忘记初始化库。快速浏览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 - Python ctypes .dll函数(pari库),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2527705/

10-10 01:53