如何使用Eclipse调试pserve?

时间:2012-02-07 02:04:50

标签: python eclipse debugging pyramid

我开始在Windows上进行Pyramid开发。我安装了Python 2.7。我使用virtualenv为我的Pyramid应用程序创建了一个漂亮的沙盒。我还在Eclipse Indigo上创建了PyDev 2.4。我还为我的virutalenv创建了一个单独的PyDev解释器,因此它应该可以访问所有目录。

我设置了一个新的调试配置。

  • 项目:testapp(工作区中唯一的项目)
  • 主要模块:$ {workspace_loc:testapp / Scripts / pserve-script.py}
  • Args :development.ini
  • 工作目录:其他:$ {workspace_loc:testapp / testapp}

当我点击Debug时,输出为:

  

pydev调试器:启动PID 2208中的启动服务器   由。开始的线程中未处理的异常   追溯(最近的呼叫最后):
  文件“C:\ Tools \ eclipse-cpp-indigo-SR1-incubation-win32-x86_64 \ eclipse \ plugins \ org.python.pydev.debug_2.3.0.2011121518 \ pysrc \ pydevd.py”,第200行,在__call__中未处理由。开始的线程中的异常   追溯(最近的呼叫最后):
  由。开始的线程中未处理的异常   追溯(最近的呼叫最后):
  文件“C:\ Tools \ eclipse-cpp-indigo-SR1-incubation-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-incubation-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-incubation-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对象参数必须是映射,而不是元组
  在http://0.0.0.0:6543上投放

即使它说服务器正在运行,但事实并非如此。没有什么东西在听那个港口。

有关如何解决此问题的任何想法?调试当然没有必要,但我喜欢有一个完全设置的开发环境。谢谢!

3 个答案:

答案 0 :(得分:2)

Pyramid包含debug toolbar

形式的非常好的调试支持

确保该行

pyramid.includes = pyramid_debugtoolbar
您的development.ini中的

未被注释掉以启用它。它不支持Eclipse断点,但几乎可以提供你想要的所有其他东西。

答案 1 :(得分:0)

没有遇到这个错误,但通常,在难以调试的环境中,可能会使用远程调试器(http://pydev.org/manual_adv_remote_debugger.html)(这种方式有点像pdb:add用于添加断点的代码,因此,在此之前,您的程序将照常运行。)

答案 2 :(得分:0)

Pyramid的pserve似乎使用多个线程,就像Fabio所暗示的那样。我发现在调用pserve之前我可以通过猴子修补ThreadTaskDispatcher来使断点工作:

# 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