我最近偶然发现了这个kickass python扩展包Brian Hears,它将解决我所有的编码问题。问题是,某些函数返回内存地址而不是预期结果。例如:
>>> Parameterize(source, 256, 128)
Out[1]: <Parameterize.Parameterize at 0xda445f8>
我以前从未见过这个(并且不知道它的正确名称);但是,互联网告诉我它是我存储结果的内存地址的表示。
我真的只对结果本身感兴趣。人们通常如何从python中的地址中提取实际数据,或者更确切地说是函数应该(或者至少我认为它应该)返回的numpy数组?
提前致谢。
编辑:添加了包的名称和链接
答案 0 :(得分:2)
它正在返回一个对象。你应该做
p = Parameterize(source, 256, 128)
res = p.usefull_attribute
然后从对象属性/属性中获取结果。您可以使用python的自我文档(dir(p)
,help(p)
(如其他答案+注释中所指出的)来让python告诉您对象具有哪些属性/方法。
打印出来的是对象的默认字符串表示形式,这是它的类型和位置。
答案 1 :(得分:2)
尽管使用ctypes编写的非常薄的Python包装器可能实际上会返回一些内存指针,但事实并非如此。
像<Parameterize.Parameterize at 0xda445f8>
这样的表示就像是Python对象的标准字符串表示。
尽管它实际上意味着一个内存地址,但这个数字在Python中没有用处,而是作为你对象的id。 (你可以通过“id(object)
”获得它。
要了解如何使用您正在使用的模块,因为您处于交互式提示符下,请使用help
和dir
内省内置函数来查找可用的属性和方法在Parameterize
对象上:
>>> p =Parameterize(source, 256, 128)
>>> p
Out[1]: <Parameterize.Parameterize at 0xda445f8>
>>> dir(p)
>>> help(p)
答案 2 :(得分:1)
如果你使用的libarary是用C(或C ++)编写的,如果函数返回“popular”(int,str等)类型,你可以对ctypes模块感兴趣(boost.python,swing)使用python类型包装C调用。然后你可以使用这个库作为python的库。当然你必须使用ctypes进行转换(你必须定义类型)。对于复杂的结构,你可能需要像tcaswell那样独自完成。