【问题标题】:How can I debug pserve using Eclipse?如何使用 Eclipse 调试 pserve?
【发布时间】:2012-02-07 02:04:50
【问题描述】:

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

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

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

当我点击调试时,输出是:

pydev 调试器:在 PID 2208 中启动服务器。

启动的线程中未处理的异常 回溯(最近一次通话最后一次):
__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 行由
启动的线程中的异常 回溯(最近一次通话最后一次):

启动的线程中未处理的异常 回溯(最近一次通话最后一次):
文件“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

尽管它说服务器正在运行,但它不是。该端口上没有任何东西在监听。

关于如何解决这个问题的任何想法?调试当然不是必需的,但我喜欢拥有一个完整设置的开发环境。谢谢!

【问题讨论】:

  • 糟糕,我意识到我没有安装 PyDev 2.4。我升级到 2.4 仍然出现同样的错误。

标签: python eclipse debugging pyramid


【解决方案1】:

Pyramid 以 debug toolbar 的形式包含非常出色的调试支持。

确保该行

pyramid.includes = pyramid_debugtoolbar

在您的development.ini 中没有注释掉以启用它。它不支持 Eclipse 断点,但提供了几乎所有你想要的东西。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我按照这些步骤在我的 Pyramid 应用程序的 __init__.py 中添加了 pydevd.settrace() 调用。遵循这些步骤后,Eclipse 在调用pydevd.settrace() 之后立即进入__init__.py。但是,我在views.py 中的唯一视图上设置了一个断点并点击继续,但从未命中该断点(当然我尝试刷新浏览器以再次执行该视图例程)。断点窗口显示views.py 断点处于活动状态,所以我不确定发生了什么。
    • 你知道它是否为请求产生了不同的进程(在这种情况下,必须在每个进程中再次调用 pydevd.settrace)...
    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多