Как я могу отладить pserve с помощью Eclipse? - PullRequest
3 голосов
/ 07 февраля 2012

Я начинаю с разработки Pyramid для Windows.У меня установлен Python 2.7.Я использовал virtualenv, чтобы создать хорошую песочницу для своего приложения Pyramid.Я также создал PyDev 2.4 на Eclipse Indigo.Я также создал отдельный интерпретатор PyDev только для моего virutalenv, поэтому он должен иметь доступ ко всем каталогам.

Я установил новую конфигурацию отладки.

  • Проект : testapp (единственный проект в рабочей области)
  • Mainmodule : $ {workspace_loc: testapp / Scripts / pserve-script.py}
  • Args : development.ini
  • Рабочий каталог : Другое: $ {workspace_loc: testapp / testapp}

Когда я нажимаю Отладка, вывод:

Отладчик pydev: запуск Запуск сервера в PID 2208.
Необработанное исключение в потоке, начатом
Трассировка (последний последний вызов):
Файл "C: \ Tools \ eclipse-cpp-indigo-SR1-инкубационный-win32-x86_64 \ eclipse \ plugins \ org.python.pydev.debug_2.3.0.2011121518 \ pysrc \ pydevd.py ", строка 200, в __call__ Необработанное исключение в потоке, начатом
трассировкой (последний вызов был последним):
Необработанное исключение в потоке, запущенном
трассировкой(последний вызов был последним):
Файл "C: \ Tools \ eclipse-cpp-indigo-SR1-инкубационный-win32-x86_64 \ eclipse \ plugins \ org.python.pydev.debug_2.3.0.2011121518 \ pysrc \ pydevd.py ", строка 200, в __call__ self.original_func (* self.args, ** self.kwargs)
Необработанное исключение в потоке, запущенном
Файл" C: \ Tools \ eclipse-cpp-indigo-SR1-инкубационный-win32-x86_64 \ eclipse \ plugins \ org.python.pydev.debug_2.3.0.2011121518 \ pysrc \ pydevd.py ", строка 200, в __call __
TypeErrorTraceback (последний вызов - последний):
self.original_func (* self.args, ** self.kwargs):
Файл "C: \ Tools \ eclipse-cpp-indigo-SR1-инкубационный-win32-x86_64 \ eclipse \ plugins \ org.python.pydev.debug_2.3.0.2011121518 \ pysrc \ pydevd.py ", строка 200, в __call__ self.original_func (* self.args, ** self.kwargs)
Аргумент объекта TypeErrorThreadedTaskDispatcher после ** должен бытьотображение, а не кортеж
TypeError: self.original_func (* self.args, ** self.kwargs): аргумент объекта ThreadedTaskDispatcher после ** должен быть отображением, а не кортеж
аргумент объекта TypeErrorThreadedTaskDispatcher после ** должен бытьотображение, а не кортеж:
аргумент объекта ThreadedTaskDispatcher after ** должен быть отображением, а не кортежем
, обслуживающим http://0.0.0.0:6543

Даже если он говорит, что сервер работает, это не так.На этом порту ничего не слушается.

Есть идеи, как это исправить?Отладка, конечно, не нужна, но мне нравится иметь полностью настроенную среду разработки.Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Pyramid включает замечательную поддержку отладки в виде панели инструментов отладки .

Убедитесь, что линия

pyramid.includes = pyramid_debugtoolbar

в вашем development.ini не закомментировано, чтобы включить его. Он не поддерживает точки останова Eclipse, но дает почти все остальное, что вам нужно.

0 голосов
/ 20 сентября 2012

Кажется, что в пирамиде есть несколько потоков, как предполагает Фабио. Я обнаружил, что могу заставить точки останова работать, монтируя патч ThreadTaskDispatcher перед вызовом pserve:

# Allow attaching PyDev to the web app
import sys;sys.path.append('..../pydev/2.5.0-2/plugins/org.python.pydev.debug_2.4.0.201208051101/pysrc/')

# Monkey patch the thread task dispatcher, so it sets up the tracer in the worker threads
from waitress.task import ThreadedTaskDispatcher
_prev_start_new_thread = ThreadedTaskDispatcher.start_new_thread
def start_new_thread(ttd, fn, args):
    def settrace_and_call(*args, **kwargs):
        import pydevd ; pydevd.settrace(suspend=False)
        return fn(*args, **kwargs)
    from thread import start_new_thread
    start_new_thread(settrace_and_call, args)
ThreadedTaskDispatcher.start_new_thread = start_new_thread

Обратите внимание, я тоже пробовал:

set_trace(..., trace_only_current_thread=False)

Но это либо делает приложение необычайно медленным, либо не работает по какой-то другой причине.

Сделав вышеизложенное, при запуске приложение автоматически зарегистрирует его на локальном сервере отладки pydev. Увидеть: http://pydev.org/manual_adv_remote_debugger.html

0 голосов
/ 08 февраля 2012

Не сталкивался с этой ошибкой, но обычно в трудных для отладки средах можно использовать удаленный отладчик (http://pydev.org/manual_adv_remote_debugger.html)) (таким образом он работает примерно так же, как pdb: add code для добавления точки останова, поэтому дос этого момента ваша программа работает как обычно).

...