好吧,几天前我决定尝试为 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)
.
是否是导致这些错误的返回类型,因为它不是标准的int
,long
而是GEN
PARI 库独有的类型?任何帮助,将不胜感激。如果有人能够成功加载库并使用 python 中的任何函数,请告诉;我已经在这几个小时了。
编辑:好像我只是忘记初始化库。很快pari.pari_init(4000000,500000)
它就停止了错误。现在我的问题在于它返回一个 GEN 对象;这很好,但是每当我尝试引用它指向的地址时,它总是 33554435,我认为它仍然是一个地址。我正在尝试进一步的命令,如果我成功获得某些东西的正确值,我会更新。