我正在尝试通过网络连接传输功能(使用asyncore).是否有一种简单的方法来序列化python函数(在这种情况下,至少,没有副作用)这样的传输?
理想情况下,我希望有一对类似的功能:
def transmit(func):
obj = pickle.dumps(func)
[send obj across the network]
def receive():
[receive obj from the network]
func = pickle.loads(s)
func()
Run Code Online (Sandbox Code Playgroud) 我已经尝试了多种方法来挑选具有依赖关系的python函数,遵循StackOverflow上的许多建议(例如dill,cloudpickle等),但似乎都遇到了一个我无法弄清楚的基本问题.
我有一个主模块,试图从导入的模块中挑选一个函数,通过ssh发送它以进行unickled并在远程机器上执行.
所以主要有:
import dill (for example)
import modulea
serial=dill.dumps( modulea.func )
send (serial)
Run Code Online (Sandbox Code Playgroud)
在远程机器上:
import dill
receive serial
funcremote = dill.loads( serial )
funcremote()
Run Code Online (Sandbox Code Playgroud)
如果被腌制和发送的函数是main本身定义的顶级函数,那么一切正常.当它们位于导入的模块中时,加载功能将失败,并显示"未找到模块模块"类型的消息.
模块名称似乎与函数名称一起被腌制.我没有看到任何方法来"修复"pickle以消除依赖关系,或者在接收器中创建一个虚拟模块以成为unpickling的接收者.
任何指针都将非常感激.
--prasanna
我正在用 pygame 制作一个绘图程序,我想在其中为用户提供一个选项,即保存程序的确切状态,然后在稍后重新加载它。在这一点上,我保存了我的 globals dict 的副本,然后迭代,酸洗每个对象。pygame 中有一些对象不能被pickle,但可以转换为字符串并通过这种方式进行pickle。我的代码已设置为执行此操作,但是通过引用访问了其中一些不可选择的对象。换句话说,它们不在全局字典中,但它们被全局字典中的对象引用。我想在这个递归中对它们进行腌制,但我不知道如何告诉 pickle 返回它遇到问题的对象,更改它,然后再次尝试对其进行腌制。我的代码真的很杂乱,如果有一种不同的、更好的方式来做我的事情
surfaceStringHeader = 'PYGAME.SURFACE_CONVERTED:'
imageToStringFormat = 'RGBA'
def save_project(filename=None):
assert filename != None, "Please specify path of project file"
pickler = pickle.Pickler(file(filename,'w'))
for key, value in globals().copy().iteritems():
#There's a bit of a kludge statement here since I don't know how to
#access module type object directly
if type(value) not in [type(sys),type(None)] and \
key not in ['__name__','value','key'] and \
(key,value) not in pygame.__dict__.iteritems() and \
(key,value) not in sys.__dict__.iteritems() and \
(key,value) …Run Code Online (Sandbox Code Playgroud) 这是一个示例代码,其中FLAG是全局变量。该方法A.func对我来说是一个黑匣子,因此我不知道它FLAG在序列化之前调用。
import dill as pickle
FLAG = 100
class A:
def func(self):
print FLAG * 10
a = A()
dump = pickle.dumps(a.func)
del FLAG
foo = pickle.loads(dump) <-- fail here "NameError: global name 'FLAG' is not defined"
foo()
Run Code Online (Sandbox Code Playgroud)
在相关问题中:
最实用的解决方案是使用cloudpickle. 但似乎dill比 更强大cloudpickle。所以我想坚持使用dill或其他成熟的腌制器。
如果有必要的话,我不介意dill自己修改一些代码。
感谢您提前提供任何帮助:)