К базовому бесплатному Pydev также существует расширение Pydev Extensions, которое, кроме того что все-таки уже стоит денег — $42,5, на которые финансируется разработка "бесплатного" Pydev — хотя, по правде говоря, позволяет работать и бесплатно, только настойчиво напоминая о том, что хочет денег. Pydev Extensions дополняет базовый пакет некоторыми приятными возможностями, среди которых — возможность удаленной отладки. Под удаленной я имею в виду отладку во внешнем по отношению к Eclipse процессе. Он может работать как на той же машине, на которой работает Eclipse, так и на удаленной, "разговаривая" с Eclipse по TCP/IP. Простая отладка возможна и без использования Pydev Extensions.
На практике это означает, что можно запросить страницу из вашего приложения, скажем на Django, и трассировать процесс генерации страницы в Eclipse. На блоге разработчиков есть статья о том как подружить Pydev с Django, в принципе, все как обычно в Eclipse. Там же описано как запустить Django из Eclipse и делать отладку обычным дебагером, тоже не ядерная физика. Я же остановлюсь на удаленной отладке (для чего нам понадобятся Pydev Extensions).
По поводу удаленной отладки разработчики также написали у себя в блоге. Информация там дана очень сжато и в моем случае не совсем соответствует действительности (в той части где про то где находятся кнопки для запуска и останова debug server). Моя инструкция будет такая.
- Для работы удаленного дебагера нужно, чтобы из процесса python, который мы собираемся трассировать, был доступен модуль
pydevd
. Исходники модуля и всего что он требует — в каталогеorg.python.pydev.debug_<версия pydev>/pysrc
, что в каталоге установки плагинов Eclipse (под Linux это может быть подкаталог .eclipse вашего домашнего каталога). Копируем каталогpysrc
со всем содержимым туда, откуда он будет доступен через PYTHONPATH вашего приложения. Переименовываем скопированный каталог в более подходящее название —pydev
. - Для того, чтобы Eclipse получала команды от удаленного отладчика, нужно запустить debug server в Eclipse. Для этого нужно открыть перспективу Debug и в ней нажать кнопку, указанную на картинке:
После нажатия появится информация о запущенном сервере: - Для того чтобы начать отладку, необходимо запустить функцию из пакета pydev, который мы сделали на шаге 1. Для этого выберите место в коде, с которого хотите начать трассировку, и добавьте выше него следующий код:
from pydev import pydevd;pydevd.settrace(myIp)
АргументmyIp
для функцииsettrace
— это IP-адрес машины, на которой запущена Eclipse (и debug server, соответственно). Для удобства это значение можно установить вsettings.py
и вызыватьsettrace
, например, так:pydevd.settrace(settings.REMOTE_DEBUG_HOST)
.
Если приложение запущено не под встроенным сервером Django, а под mod_python или в режиме FastCGI, то нужно будет перезапустить Apache или процесс приложения соответственно. - В-общем, всё готово для сеанса удаленной отладки. Откройте браузер, отправьте запрос приложению и переключитесь обратно в Eclipse. Если код трассировщика, который мы добавили на предыдущем шаге, будет задействован в процессе обработки запроса, то вы увидите примерно такую картину:
Вверху вы видите стек вызовов, справа — локальные переменные, внизу - код в процессе отладки. Подсвеченная строка - следующая инструкция после вызоваsettrace
. Вы можете трассировать код дальше как обычно, перемещаться по стеку и просматривать значения переменных.
В настоящее время с удаленным дебагером связано одно неудобство. Состоит оно в следующем.
Удаленный дебаг-сервер (код которого в пакете pydev, который мы устанавливали на первом шаге) передает в Eclipse отладочную информацию, и в ней в качестве имени файла, в котором идет отладка, передается полный путь к файлу на удаленной машине. Этот путь почти наверняка не будут совпадать с именем файла на машине разработчика, где и запущен Eclipse, если это — не та же машина, на которой запущено трассируемое приложение. Если обе машины работают под сходными системами (например, обе - под Windows или под Unix/Linux), то это затруднение преодолимо. Если же машина, на которой запущено веб-приложение, работает под Linux, а машина разработчика — Windows (ситуация распространенная), то стандартными средствами это несовпадение путей решить не получится.
В результате дебагер не будет находить нужный файл на вашей машине, и будет спрашивать вас на каждом шаге, какой именно файл имелся в виду.
Для этой проблемы я нашел следующее решение. В коде
pydevd
была найдена функция, которая определяет путь к файлу на удаленной машине, который затем и отправляется вместе с отладочной информацией. Эта функция переработана так, чтобы она транслировала путь на удаленной машине в соответствующий путь на локальной машине. Найдите в файле pydevd_comm.py
в пакете pydev
функцию NormFile
и перепишите ее так:FILE_TRANS_MAP = {'/home/max/project/': 'z:/',
'/usr/lib/python2.4/': 'c:/Python24/Lib/'}
def NormFile(filename):
try:
rPath = os.path.realpath #@UndefinedVariable
except:
# jython does not support os.path.realpath
# realpath is a no-op on systems without islink support
rPath = os.path.abspath
fname = os.path.normcase(rPath(filename))
for _from, _to in FILE_TRANS_MAP.items():
if fname.startswith(_from):
fname = fname.replace(_from, _to, 1)
break
return fname
В словаре
FILE_TRANS_MAP
укажите свои соответствия (в моем случае транслируются пути к стандартной установке Python и каталогу проекта, который подключен к машине под Windows через Samba). После этого дебагер Eclipse будет получать имена файлов в том виде, в котором они доступны на локальной машине.Конечно, было бы удобнее задавать соответстия путей не в коде удаленного сервера, а в свойствах проекта в самом Eclipse. Такое предложение отправлено разработчикам и они собираются внедрить его в одной из ближайших версий Pydev Extensions, а пока можно пользоваться этим рецептом.
Happy debugging :)
Спасибо за подробную статью. Как раз хотел на досуге попробывать прикрутить django в Eclipse pydev.
ОтветитьУдалитьСупер! Спасибо за наводку. Попробовал, и у меня получилось. Протащился как удав по гравию, просто супер. ;)
ОтветитьУдалитьА я лучшим IDE для Питона считаю WingIDE.
ОтветитьУдалитьА мне нравится PyScripter, жалко только что под линукс версии нет
ОтветитьУдалитьРешил попробовать PyDev, сразу возникла небольшая проблемка. Извиняюсь, что не в тему. У меня Ubuntu и django из svn, в site-packages символическая ссылка на django (как рекомендовалось в документации). PyDev напрочь отказывается обрабатывать каталоги, заданные таким образом. Обойти этот баг (фичу?) просто, но нехорошо :(
ОтветитьУдалить>>stoune Says:
ОтветитьУдалить>>25-05-2007 at 4:33
>>
>>А я лучшим IDE для Питона >>считаю WingIDE
А как насчет того что это есть платное как это можно использовать без покупки?
А как у нас все в России используется?... ;) мне лично тоже он понравился
ОтветитьУдалитьСам перешел с винга на пайдев. Самый большой вопрос, который меня интересует - как заставить его табы вставлять как табы, и ни в коем случае на пробелы. А то что он туда вставляет - похоже от фазы луны зависит.
ОтветитьУдалить