Python 与memset抗争
我想要一个类似指针的函数。因为我只允许将Python 与memset抗争,python,memset,Python,Memset,我想要一个类似指针的函数。因为我只允许将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类型的可能
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类型的可能性很大,这样我也可以传递一个可调用的对象。更新:
因为主线程和后台线程在同一个程序上,共享内存。您可以使用单个字典创建用于存储变量及其键的容器:
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
如果您使用的是Python3.2+,那么也可以使用
int.from_bytes()
和int.to_bytes()
来实现这一点。您也可以将long
作为参数传递吗?文档中说int,但我用了很长的时间进行了测试。使用long而不是int有什么好处?不管怎样,谢谢你花时间回答。你可以使用列表:a=[10];b=[12];打印b[0];b=a;打印b[0];a[0]=8;打印b[0]代码>不,我不能,因为我不能将列表作为参数传递:/a将在其他作用域/脚本中定义,所以我真的需要一个像Ethanks这样的指针,这是个好主意。但遗憾的是,我们对2.7 python很感兴趣,而且sdk内部似乎进行了从long到int的转换,因为我遇到了这个错误:overflowerrror:python int太大,无法转换为C long,但这是一个好主意@如果您可以多次调用SDK,那么您可以将大的数字拆分为几个较小的数字。那么它就不会给出溢出错误。如果SDK不能保证按顺序运行这些数字,您甚至可以保留一些序列字节来保持这些数字的顺序。是的,这是一个想法,但它并不干净,因为传入此函数的参数在主线程中,而我们对该函数的调用在后台线程中。这将导致洪水和主线的延迟。但这是一个可行的解决方案。所以,如果没有其他解决办法,我就去做。另外,我不确定变量的发送端和接收端是否在同一个程序中(并共享内存)。但通常您可能希望尝试memcache
:将对象存储在memcache
中,但将创建的唯一整数密钥传递给SDK。这甚至可以跨多台机器工作。它将在同一个程序上。因此内存是共享的。就是为了这个,我想用memset。我不想使用外部库,因为它对于客户安装来说有点无聊。python中有没有一种方法可以将对象的内存表示形式复制到另一个对象上?sdk提供了一种存储字节的方法,并获取该字节的uuid,以便我以后可以恢复它们。无论如何,谢谢你的研究!:)