В качестве продолжения этого вопроса: Есть ли простой способ раскрыть функцию 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)
Затем, начиная с нового экземпляра 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 в процессе приема?
Кто-то также рекомендовал посмотреть на пиро, как пример того, как это сделать. Я уже пытался попытаться понять соответствующий код в проекте дискотек. Я взял их класс 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)
Рабочая функция_процессор:
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()