作爲後續到這樣一個問題: Is there an easy way to pickle a python function (or otherwise serialize its code)?如何醃一個python函數及其依賴項?
我想看到從上述交此子彈的一個示例:
「如果函數引用全局(包括導入模塊,其他功能等)你需要提取它們,或者在遠程端重新創建它們,我的示例只是給它提供了遠程進程的全局名稱空間。「
我有一個簡單的測試去的地方我使用元帥寫一個函數字節碼文件:
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)
然後開始一個新的蟒蛇比如我做的事:
file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')
這導致a:
NameError: global name 'g' is not defined
這與我對包括g的不同方法無關。我已經嘗試了基本上相同的方法來發送g作爲f,但f仍然看不到g。我如何讓g進入全局命名空間,以便f可以在接收過程中使用它?
有人還建議以pyro爲例說明如何做到這一點。我已經嘗試瞭解迪斯科項目中的相關代碼。我帶着他們的dPickle類,並嘗試在獨立的應用程序中重新創建他們的disco/tests/test_pickle.py功能,但沒有成功。我的實驗在調用dump函數時遇到了問題。無論如何,也許下一個pyro探險。
總的來說,我所能達到的基本功能是能夠通過電線發送一種方法,並將所有基本的「工作空間」方法(如g)發送出去。
實施例與來自答案改變:
工作function_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)
工作function_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()
哇哦,我不知道指定的參考了一定的作用!謝謝!將發佈工作代碼。 – 2012-04-06 19:36:47
@RyanR。 :自己發佈一些代碼。 – kindall 2012-04-06 19:41:03
太棒了,我喜歡沙箱。想要自動探索下一個自動序列化所有函數依賴項。有點像迪斯科modutil.find_modules方法所做的。感謝幫助。 – 2012-04-06 20:01:36