के रूप में एक इस सवाल का ऊपर का पालन करें: Is there an easy way to pickle a python function (or otherwise serialize its code)?अपनी निर्भरताओं के साथ एक अजगर समारोह कैसे उठाया जाए?
मैं ऊपर पोस्ट से इस गोली का एक उदाहरण देखना चाहेंगे:
"यदि समारोह संदर्भ वैश्विक (आयातित मॉड्यूल, अन्य कार्यों आदि सहित) कि आपको लेने की जरूरत है, आपको इन्हें क्रमबद्ध करने की आवश्यकता होगी, या उन्हें दूरस्थ पक्ष पर फिर से बनाना होगा। मेरा उदाहरण सिर्फ इसे दूरस्थ प्रक्रिया का वैश्विक नामस्थान देता है। "
file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')
इस में जो परिणाम:
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)
फिर एक ताजा अजगर उदाहरण मुझे क्या करना शुरू कर:
मैं एक साधारण परीक्षण के लिए जा रहा है, जहां मैं मार्शल का उपयोग कर एक फाइल करने के लिए एक कार्यों बाइट कोड लिख रहा हूँ है ए:
NameError: global name 'g' is not defined
यह जी सहित विभिन्न दृष्टिकोणों से स्वतंत्र है। मैंने मूल रूप से एफ के रूप में जी भेजने के लिए एक ही दृष्टिकोण की कोशिश की है लेकिन एफ अभी भी जी नहीं देख सकता है। मैं ग्लोबल नेमस्पेस में जी कैसे प्राप्त करूं ताकि इसे प्राप्त करने की प्रक्रिया में एफ द्वारा उपयोग किया जा सके?
किसी ने भी इसे करने के उदाहरण के रूप में पाइरो को देखने की सिफारिश की। मैंने पहले ही डिस्को परियोजना में संबंधित कोड को समझने की कोशिश करने का प्रयास किया है। मैंने अपनी डीपीकल कक्षा ली और सफलता के बिना एक स्टैंडअलोन ऐप में अपने डिस्को/परीक्षण/test_pickle.py कार्यक्षमता को फिर से बनाने की कोशिश की। मेरे प्रयोग में डंप कॉल के साथ फ़ंक्शन मार्शलिंग करने में समस्याएं थीं। वैसे भी, शायद एक पाइरो अन्वेषण अगला है।
संक्षेप में, मूलभूत कार्यक्षमता मैं बाद में तार पर एक विधि भेजने में सक्षम हूं और इसके साथ भेजे गए सभी मूल "कार्यक्षेत्र" विधियों (जैसे जी) है। जवाब से परिवर्तन के साथ
उदाहरण:
कार्य 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()
ओह वाह, मुझे एहसास नहीं हुआ कि निर्दिष्ट संदर्भ में कोई फर्क पड़ता है! धन्यवाद! काम कोड पोस्ट करेंगे। –
@RyanR। : कुछ कोड खुद को पोस्ट किया। – kindall
ग्रेट, मुझे सैंडबॉक्स पसंद है। स्वचालित रूप से सभी कार्य निर्भरताओं को स्वचालित रूप से क्रमबद्ध करने के लिए अगले ऑटो का पता लगाना चाहते हैं। डिस्को modutil.find_modules विधि क्या करता है की तरह सॉर्ट करें। मदद की सराहना करें। –