作为这个问题的后续:有没有一种简单的方法来pickle python 函数(或以其他方式序列化其代码)? https://stackoverflow.com/questions/1253528/is-there-an-easy-way-to-pickle-a-python-function-or-otherwise-serialize-its-cod
我想从上面的帖子中看到这个项目符号的示例:
“如果函数引用您需要获取的全局变量(包括导入的模块、其他函数等),您也需要序列化它们,或者在远程端重新创建它们。我的示例只是为其提供了远程进程的全局命名空间。 ”
我有一个简单的测试,我使用 marshal 将函数字节代码写入文件:
def g(self,blah):
print blah
def f(self):
for i in range(1,5):
print 'some function f'
g('some string used by g')
data = marshal.dumps(f.func_code)
file = open('/tmp/f2.txt', 'w')
file.write(data)
然后启动一个新的 python 实例:
file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')
这导致:
NameError: global name 'g' is not defined
这与我为包含 g 所采取的不同方法无关。我已经尝试了与 f 发送 g 基本相同的方法,但 f 仍然看不到 g。如何让 g 进入全局命名空间,以便 f 在接收进程中可以使用它?
有人还建议查看 Pyro 作为如何执行此操作的示例。我已经尝试过尝试理解迪斯科项目中的相关代码。我学习了他们的 dPickle 类,并尝试在独立应用程序中重新创建他们的 disco/tests/test_pickle.py 功能,但没有成功。我的实验在使用转储调用进行函数封送时遇到了问题。无论如何,也许下一步就是进行火工探索。
总之,我所追求的基本功能是能够通过线路发送方法,并发送所有基本的“工作区”方法(如 g)。
答案更改的示例:
工作函数_writer:
import marshal, types
def g(blah):
print blah
def f():
for i in range(1,5):
print 'some function f'
g('blah string used by g')
f_data = marshal.dumps(f.func_code)
g_data = marshal.dumps(g.func_code);
f_file = open('/tmp/f.txt', 'w')
f_file.write(f_data)
g_file = open('/tmp/g.txt', 'w')
g_file.write(g_data)
工作函数_reader:
import marshal, types
f_file = open('/tmp/f.txt', 'r')
g_file = open('/tmp/g.txt', 'r')
f_code = marshal.loads(f_file.read())
g_code = marshal.loads(g_file.read())
f = types.FunctionType(f_code, globals(), 'f');
g = types.FunctionType(g_code, globals(), 'g');
f()