- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用远程过程调用在两个过程之间进行通信。我将对象从手上发送到另一个。该对象是 django 模型的对象。该对象具有不同的变量、整数和字符串。
如果我只更改整数变量,一切正常。如果我第一次更改一个字符串变量它也可以工作,但是如果我第二次更改一个字符串我的代码崩溃并且我收到以下错误消息
Traceback (most recent call last):
File "/home/manch011/disserver/src/disserver/gui/backends/receiver.py", line 69, in run
name, args, kwargs = cPickle.load(connFile)
cPickle.UnpicklingError: pickle data was truncated
这是我的代码,在服务器端:
_exportedMethods = {
'changes': signal_when_changes,
}
class ServerThread(QtCore.QThread):
def __init__(self):
super(ServerThread,self).__init__()
st = self
#threading.Thread.__init__(self)
def run(self):
HOST = '' # local host
PORT = 50000
SERVER_ADDRESS = HOST, PORT
# set up server socket
s = socket.socket()
s.bind(SERVER_ADDRESS)
s.listen(5)
while True:
conn, addr = s.accept()
connFile = conn.makefile()
name, args, kwargs = cPickle.load(connFile)
res = _exportedMethods[name](*args,**kwargs)
cPickle.dump(res,connFile) ; connFile.flush()
conn.close()
这是客户端:
class RemoteFunction(object):
def __init__(self,serverAddress,name):
self.serverAddress = serverAddress
self.name = name
def __call__(self,*args,**kwargs):
s = socket.socket()
s.connect(self.serverAddress)
f = s.makefile()
cPickle.dump((self.name,args,kwargs), f)
f.flush()
res = cPickle.load(f)
s.close()
return res
def machine_changed_signal(machine):
HOST = ''
PORT = 50000
SERVER_ADDRESS = HOST, PORT
advise = RemoteFunction(SERVER_ADDRESS,'changes')
advise(machine)
我不熟悉 cPickle,因此无法理解这一点,有人可以向我解释一下吗?
在此先感谢 Chis
最佳答案
我解决了我自己的问题。但首先我在问题中描述的错误信息没有意义。
我是新解决的问题并使用了 Pyro4 框架。所以我收到了一条新的错误消息,它与旧的相同但很清楚。你不能 pickle 类对象。因为在我的例子中我只需要属性值,所以我在一个简单的字典中传递了它。
首先下载Pyro4并安装它一个类似于 Pyro homepage 上的示例的简单示例:
# saved as helloworld.py
import Pyro4
import threading
import os
class HelloWorld(object):
def get_hello_world(self, name):
return "HelloWorld,{0}.".format(name)
#The NameServer had to run in a own thread because he has his own eventloop
class NameServer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
os.system("python -m Pyro4.naming")
ns = NameServer()
ns.start()
hello_world=HelloWorld()
daemon=Pyro4.Daemon() # make a Pyro daemon
ns=Pyro4.locateNS() # find the name server
uri=daemon.register(hello_world) # register the greeting object as a Pyro object
ns.register("example.helloworld", uri) # register the object with a name in the name server
print "Ready."
daemon.requestLoop() # start the event loop of the server to wait for calls
运行这个程序然后执行下一个程序
# saved as client.py
import Pyro4
name=raw_input("What is your name? ").strip()
helloworld=Pyro4.Proxy("PYRONAME:example.helloworld") # use name server object lookup uri shortcut
print helloworld.get_hello_world(name)
重要你不能传输类实例。所以“名称”不能是类实例。
关于python - cPickle.UnpicklingError : pickle data was truncated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209956/
如何让此代码在重新打开时记住秤的最后位置? import Tkinter import cPickle root = Tkinter.Tk() root.sclX = Tkinter.Scale(ro
我正在尝试使用 cPickle 加载一个文件,如下所示, import cPickle cPickle.load(open('test', 'rb')) 但是,我得到这个错误, -----------
我有一个列表列表,每个子列表看起来像这样: a = [datetime.datetime(2012, 2, 1), datetime.datetime(2012, 2, 2), 'string', 4
我浏览了相关 cPickle 问题的各种回复,但似乎没有一个有帮助。使用 cloudpickle 代替 cPickle 也没有效果。 我有一个名为 MyModule 的模块,它定义了一个 MyClas
我有大约 80 万张 256x256 RGB 图像,总计超过 7GB。 我想将它们用作卷积神经网络中的训练数据,并想将它们连同它们的标签一起放入 cPickle 文件中。 现在,这占用了大量内存,以至
我正在使用 cPickle 序列化用于日志记录的数据。 我希望能够将我想要的任何东西放入对象中,然后将其序列化。通常这对 cPickle 没问题,但遇到了一个问题,我想序列化的对象之一包含一个函数。这
我正在使用 cPickle 将字典对象存储到文件中,并且无法获取除第一个条目之外的任何其他条目。最初,文件 tweets.pkl 为空,并且引发 EOFError。我确信这与它有关。谢谢 #!/usr
在我的脚本中,我尝试使用cPickle保存字典。一切工作正常,除了加载的字典已经修改每个键。我的字典看起来像:{'a':[45,155856,26,98536], 'b':[88,68,9454,78
我希望能够有一系列使用相同 pickle 文件的嵌套循环。见下文: def pickleRead(self): try: with open(r'myfile', 'rb')
cPickle.dump(object,file) 总是在文件末尾转储。有没有办法在文件中的特定位置转储?我希望下面的代码片段能够工作 file = open("test","ab") file.se
我有一个 python 程序,我想从 cmd 提示符运行,但每次我尝试时,它总是给我一个错误“NameError: name cPickle is not defined”。 我使用的是 python
你能帮我实现这个例子吗? 如果序列化字典存在,我想加载它,修改它并再次转储它。我认为我用于打开文件的模式有问题,但我不知道正确的方法。 import os import cPickle as pick
python 对象是字符串和数字的嵌套列表。 文件被打开以写入“w”(不是“wb”)但 cPickle 被告知使用 protocol=1(所以二进制)。 序列化和反序列化代码在 Linux 上运行良好
我意识到答案很可能是“否”! 基本上,我有一个表示正方形网格的图(节点和边类型);每个节点对象都包含对该节点有边的每个其他节点的引用,这似乎意味着当使用 cPickle.dump 序列化图形时,它以深
我有一个名为 classifier.pkl 的 pickled 文件,我正试图将其加载到另一个模块中。但是,我收到一个我不明白的错误。 我要 pickle 的代码: features = ['bob'
我将运行代码,将大量(~1000)个相对较小(50 个键:值对字符串)的字典写入日志文件。我将通过一个自动执行此操作的程序来完成此操作。我正在考虑运行如下命令: import random impor
我想在文件中保存一个 pickle.dumps() 结果,每行一个结果,如下例所示。然后当我读取文件时加载行时,我发现相同的结果包含一个换行符。 数据,由制表符分隔: 20120305\txxxxx\
我正在考虑创建像 dbms 引擎这样的持久存储的想法,与直接 cPickling 对象和/或使用搁置模块相比,创建自定义二进制格式有什么好处? 最佳答案 Pickling 是一个双面硬币。 一方面,您
有没有人能解释testLookups() 下的注释 code snippet ? 我已经运行了代码,确实评论说的是真的。但是我想了解为什么它是真的,即为什么 cPickle 根据引用方式为同一对象输出
我是 Python 新手。我正在将别人的代码从 Python 2.X 改编到 3.5。该代码通过 cPickle 加载文件。我将所有出现的“cPickle”更改为“pickle”,因为我知道 pick
我是一名优秀的程序员,十分优秀!