Python:从内存位置提取数据

时间:2012-10-23 01:33:54

标签: python memory memory-address

我最近偶然发现了这个kickass python扩展包Brian Hears,它将解决我所有的编码问题。问题是,某些函数返回内存地址而不是预期结果。例如:

  

>>> Parameterize(source, 256, 128)

     
    

Out[1]: <Parameterize.Parameterize at 0xda445f8>

  

我以前从未见过这个(并且不知道它的正确名称);但是,互联网告诉我它是我存储结果的内存地址的表示。

我真的只对结果本身感兴趣。人们通常如何从python中的地址中提取实际数据,或者更确切地说是函数应该(或者至少我认为它应该)返回的numpy数组?

提前致谢。

编辑:添加了包的名称和链接

3 个答案:

答案 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)”获得它。

要了解如何使用您正在使用的模块,因为您处于交互式提示符下,请使用helpdir内省内置函数来查找可用的属性和方法在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那样独自完成。