2012-06-04 1 views
0

Я использую CherryPy для генерации и анализа данных для веб-страницы php, но получаю ошибку, которую я не могу реплицировать локально или через SSH (вход в сервер и запуск скрипта python из подсказки работает нормально).CherryPy & php: не может загрузить класс данных из pickle, но работает с ssh на сервере

Сообщения тока липкой ошибки:

File "modules/flex.py", line 335, in convert 
    ref_data = cPickle.load(f2) 
AttributeError: 'module' object has no attribute 'Data' 

Других маринованные нагрузки штраф в предыдущей строке, и оба маринады представляют собой объекты класса с различными словарями и списков списков. Но одна из этих работ, а другая - нет.

В целом с CherryPy, как лучше всего изолировать сообщения об ошибках? Я могу запустить/cp/function из его URL-адреса, и я могу посмотреть журнал ошибок веб-сервера, но даже эти два не всегда дают сообщение об ошибке (или правильную ошибку).

С другой стороны, в PHP, я использую этот код, чтобы получить объект JSON, представляющий список питона списков:

$obj = file_get_contents($senddata); 
$sue = json_decode($obj); 

является то, что приемлемый метод? Каков наилучший способ передачи и генерации php-массивов из структур данных python?

+0

В настоящее время обходит эту проблему, создавая таблицу MySQL и вытягивая данные таким образом, но я все еще хочу знать, почему рассол не работает. Я не могу просто строить таблицу каждый раз, когда я хочу это сделать! –

+0

Теперь я уверен, что не могу сохранить и загрузить CLASS с данными на этом сервере, но я могу сделать это на своей локальной машине или при запуске скрипта python из приглашения SSH. Однако, если я сохраню словарь словарей в рассоле, он работает нормально. Это вихревая ошибка или предполагаемое поведение? –

ответ

1

Я думаю, что у вас есть различные вопросы:

  1. Ваш код не работает, потому что PYTHONPATH (sys.path) не в вашем интерпретатора то же , когда вы подключены корыто SSH и питона , который работает для обслуживания webapp. Я говорю, что, потому что вы зафиксируете десериализовать данных из модуля, который он делает существует (в противном случае будет ImportError) , но не имеет class декларацию Data, вероятно, файл с тем же именем, что модуль находится в тот же каталог и пытается найти class Data в этом файле. Когда вы выполняете сериализацию, вы не сохраняете декларацию класса, просто как восстановить этот объект.

  2. Что вы имеете в виду с «правильными» ошибками ?, когда среда является «производством», CherryPy по умолчанию лога отслеживающего последней ошибки, вы, конечно, можете изменить поведение по умолчанию с custom error handling.

  3. Вы должны придерживаться JSON для связи между языками, довольно стандартно и эффективны для анализа в обеих сторонах.

Надеюсь, что это поможет.

+0

Итак, если я получу вас правильно: если Data относится к экземпляру маринуемого класса, а не к объекту класса, он не будет правильно расклеиваться? –

+0

«Правильная ошибка» - я имею в виду, что сообщения об ошибках содержат полезную информацию о том, где искать ошибку.В этом случае я не понял, что указывает ошибка. –

+0

Это хранилище данных локального (того же сервера), что и рассол. Думаю, я переписал его, чтобы сохранить как JSON, и ошибка была решена - как вы заметили. –