作为这个问题的后续: 是否有一种简单的方法来腌制 python 函数(或以其他方式序列化其代码)?
我想从上面的帖子中看到这个项目符号的一个例子:
“如果该函数引用了您需要获取的全局变量(包括导入的模块、其他函数等),您也需要将它们序列化,或者在远程端重新创建它们。我的示例只是给它远程进程的全局命名空间。 "
我有一个简单的测试,我正在使用 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 所做的不同方法无关。我已经尝试过基本相同的方法将 g 作为 f 发送,但 f 仍然看不到 g。如何让 g 进入全局命名空间,以便 f 在接收过程中使用它?
有人还建议将 pyro 视为如何执行此操作的示例。我已经尝试理解disco项目中的相关代码。我参加了他们的 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()