【问题标题】:struggling with memset与 memset 斗争
【发布时间】:2016-12-15 10:05:34
【问题描述】:

我想要一个类似指针的函数。由于我只允许将int 作为参数传递,并且我希望能够将所有类型的数据传递给函数。 (我无法修改它在 SDK 中硬编码的这个函数)

所以我想使用一个变量的 id,然后将该值重新分配给另一个值,该值将在我的函数中。

我希望有这样的人在工作

import ctypes

a = 10
b = 12
print b #here I want 12

ctypes.memset(id(b), a, 8)
print b #here I want 10

使用python类型的可能性很大,这样我也可以传递一个可调用的对象。

【问题讨论】:

  • 你也可以将long 作为参数传递吗?
  • 文档说 int 但我测试了很长时间它工作。使用 long 而不是 int 有什么好处?无论如何,感谢您花时间回答
  • 您可以使用列表:a=[10]; b=[12]; print b[0]; b=a; print b[0]; a[0]=8; print b[0];
  • 不,我不能,因为我不能将列表作为参数传递:/ a 将在其他范围/脚本中定义,所以我真的需要像这样的指针

标签: python memset


【解决方案1】:

更新:

由于主线程和后台线程在同一个程序上并且共享内存。您可以使用单个字典创建一个容器来存储变量及其键:

import random

mystorage = {}


def getint(value):
    while True:
        key = random.randint(0, 0xffffffff)
        if key in mystorage:
            continue
        mystorage[key] = value
        return key


def getvalue(key):
    return mystorage.get(key)

根据您的情况,您可能需要在测试密钥是否冲突时添加写锁。但通常这对于多线程程序来说效果很好。


只是使用int(实际上是long)类型来传递任何可腌制对象的想法:

import codecs
import pickle


def dumps(payload):
    data = pickle.dumps(payload)
    return int(codecs.encode(data, 'hex'), 16)


def loads(intval):
    data = codecs.decode(hex(intval)[2:].encode('ascii'), 'hex')
    return pickle.loads(data)


assert loads(dumps({'foo': 'bar'})) == {'foo': 'bar'}
# no error

如果您使用的是 Python 3.2+,也可以使用 int.from_bytes()int.to_bytes() 来实现此目的。

【讨论】:

  • 谢谢这是个好主意。但遗憾的是,我们坚持使用 2.7 python,并且似乎在内部 sdk 进行了从 long 到 int 的转换,因为我收到了这个错误:OverflowError: Python int too large to convert to C long 但这是个好主意!
  • @graphos 好吧,如果您可以多次调用 SDK,您可以将大数字拆分为几个较小的数字。然后它不会给出OverflowError。如果 SDK 不能保证按顺序运行数字,您甚至可以保留一些序列字节来保持这些数字的顺序。
  • 是的,这可能是一个想法,但它并不干净,因为传递给这个函数的参数是在主线程中,而我们对函数的调用是在后台线程上。这将导致主线程泛滥和延迟。但这是一个可行的解决方案。所以如果没有其他解决方案,我会去。
  • @graphos 好的。另外我不确定变量的发送端和接收端是否在同一个程序中(并共享内存)。但通常您可能想尝试memcache:将您的对象存储在memcache 中,但将您创建的唯一整数键传递给SDK。这甚至可以跨多台机器工作。
  • 会在同一个程序上,所以内存是共享的。为此我想使用 memset。而且我不想使用外部库,因为它对客户安装来说有点无聊。 python中有没有办法复制一个对象的内存表示然后传递到另一个? sdk 提供了一种存储字节并获取该字节的 uuid 的方法,以便我以后可以恢复它们。无论如何,感谢您的所有研究! :)
猜你喜欢
  • 2020-09-18
  • 2018-05-23
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2014-10-04
  • 2019-08-10
相关资源
最近更新 更多