пользовательский объект ipython parallel push

#parallel-processing #ipython

#параллельная обработка #ipython

Вопрос:

Я не могу отправить объект работникам прямого просмотра. Вот что я хочу сделать:

тест класса:
def __init__(self):
 self.id = 'ддфдф'

из IPython.клиент параллельного импорта
rc = Client()
dv = rc[:]
t = Test()
dv['t'] = t
печать dv['t']

Ошибка имени: имя 't' не определено

Это сработает, если я попытаюсь запустить объект pandas или любой из встроенных объектов. Как это можно сделать с помощью пользовательского объекта?

Я пытался:

dv['Test'] = Тест
dv['t'] = t
печать dv['t']
Ошибка UnpicklingError: аргумент класса NEWOBJ не является объектом типа

Комментарии:

1. Зная кое-что о том, как работает pickle, попробуйте нажать класс (Test) перед экземпляром (t).

2. Есть ли способ сделать это, не нажимая класс первым?

Ответ №1:

Для интерактивно определенных классов (in __main__ ) вам нужно нажать определение класса или использовать dill. Но даже это, похоже, не работает для классов старого стиля, что является ошибкой в обработке IPython классов старого стиля [1]. Этот код отлично работает, если вы используете класс нового стиля:

 class Test(object):
    ...
  

вместо класса старого стиля. Обратите внимание, что классы старого стиля недоступны в Python 3.
Как правило, рекомендуется всегда использовать классы нового стиля.

Комментарии:

1. minrk: Ваше предложение работает для примера, но когда я импортирую тестовый класс из file: ‘from test import Test’, тогда dv[‘Test’] = Test завершится неудачей. У вас есть какие-либо предложения?

2. Вам не нужно нажимать Test, если он находится в модуле, но сам модуль должен быть доступен. Является ли модуль локальным файлом? Если это так, вероятно, хорошей идеей будет отправить файл на все ваши компьютеры. Если ваши движки являются локальными, то вы можете просто убедиться, что движки имеют тот же CWD, что и клиент.