2012-02-07 5 views
3

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

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

  • Проект: TestApp (единственный проект в рабочем пространстве)
  • Основной модуль: $ {workspace_loc: TestApp/Scripts/pserve-script.py}
  • Args: разработка. ини
  • Работа реж: Другое: $ {workspace_loc: TestApp/TestApp}

Когда я ударил Debug, выход:

pydev debugger: starting Starting server in PID 2208.
Unhandled exception in thread started by
Traceback (most recent call last):
File "C:\Tools\eclipse-cpp-indigo-SR1-incubation-win32-x86_64\eclipse\plugins\org.python.pydev.debug_2.3.0.2011121518\pysrc\pydevd.py", line 200, in __call__ Unhandled exception in thread started by
Traceback (most recent call last):
Unhandled exception in thread started by
Traceback (most recent call last):
File "C:\Tools\eclipse-cpp-indigo-SR1-incubation-win32-x86_64\eclipse\plugins\org.python.pydev.debug_2.3.0.2011121518\pysrc\pydevd.py", line 200, in __call__ self.original_func(*self.args, **self.kwargs)
Unhandled exception in thread started by
File "C:\Tools\eclipse-cpp-indigo-SR1-incubation-win32-x86_64\eclipse\plugins\org.python.pydev.debug_2.3.0.2011121518\pysrc\pydevd.py", line 200, in __call__
TypeErrorTraceback (most recent call last):
self.original_func(*self.args, **self.kwargs) :
File "C:\Tools\eclipse-cpp-indigo-SR1-incubation-win32-x86_64\eclipse\plugins\org.python.pydev.debug_2.3.0.2011121518\pysrc\pydevd.py", line 200, in __call__ self.original_func(*self.args, **self.kwargs)
TypeErrorThreadedTaskDispatcher object argument after ** must be a mapping, not tuple
TypeError: self.original_func(*self.args, **self.kwargs) : ThreadedTaskDispatcher object argument after ** must be a mapping, not tuple
TypeErrorThreadedTaskDispatcher object argument after ** must be a mapping, not tuple :
ThreadedTaskDispatcher object argument after ** must be a mapping, not tuple
serving on http://0.0.0.0:6543

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

Любая идея о том, как исправить это? Конечно, отладки не нужны, но мне нравится иметь полностью настроенную среду разработки. Благодаря!

+0

К сожалению, у меня не было установлен PyDev 2.4. Я обновляюсь до 2.4, и я все равно получаю ту же ошибку. – jmacdonagh

ответ

0

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

+0

Спасибо за ответ. Я выполнил следующие шаги и добавил вызов 'pydevd.settrace()' в моем приложении Pyramid '__init __. Py'. После выполнения шагов Eclipse * * перейдет в '__init __. Py' сразу после вызова' pydevd.settrace() '.Тем не менее, я установил точку останова на моем единственном представлении в 'views.py' и нажимаю continue, но эта точка останова никогда не попадает (и, конечно же, я попробовал обновить браузер, чтобы снова использовать эту программу просмотра). Окно точек останова показывает, что контрольная точка 'views.py' активна, поэтому я не уверен, что происходит. – jmacdonagh

+0

Знаете ли вы, что он порождает другой процесс для запросов (в этом случае pydevd.settrace должен быть вызван снова в каждом процессе) ... –

2

Пирамида включает в себя замечательно хорошую поддержку отладки в виде debug toolbar.

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

pyramid.includes = pyramid_debugtoolbar 

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

0

Пирамида, похоже, использует несколько потоков, например, предложения Фабио. Я нашел, что я мог бы сделать контрольные точки работают на обезьяний Патченье 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) 

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

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

Смежные вопросы