如何在Eclipse中调试pserve?

3 投票
3 回答
1352 浏览
提问于 2025-04-17 12:28

我刚开始在Windows上开发Pyramid应用,已经安装了Python 2.7。我使用virtualenv创建了一个独立的环境来运行我的Pyramid应用。同时,我在Eclipse Indigo上安装了PyDev 2.4,并为我的virtualenv创建了一个单独的PyDev解释器,这样它就可以访问所有的目录。

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

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

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

pydev调试器:正在启动服务器,进程ID是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__ 中
TypeError回溯(最近的调用在最后):
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)
TypeError线程任务调度器对象的参数必须是一个映射,而不是元组
TypeError: self.original_func(*self.args, **self.kwargs) : 线程任务调度器对象的参数必须是一个映射,而不是元组
TypeError线程任务调度器对象的参数必须是一个映射,而不是元组 :
线程任务调度器对象的参数必须是一个映射,而不是元组
正在服务于 http://0.0.0.0:6543

尽管它说服务器正在运行,但实际上并没有。那个端口上没有任何东西在监听。

有没有什么办法可以解决这个问题?虽然调试并不是必须的,但我喜欢有一个完全设置好的开发环境。谢谢!

3 个回答

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

0

我还没遇到过那个错误,不过通常在一些难以调试的环境中,可以使用远程调试工具(http://pydev.org/manual_adv_remote_debugger.html)。这样的话,它的工作方式有点像pdb:你可以添加一些代码来设置断点,这样在到达那个断点之前,你的程序就会照常运行。

2

Pyramid 提供了非常不错的调试支持,主要通过一个叫做 调试工具栏 来实现。

确保你的 development.ini 文件中有这一行

pyramid.includes = pyramid_debugtoolbar

而且这一行没有被注释掉,这样才能启用这个功能。虽然它不支持在 Eclipse 中设置断点,但几乎能提供你需要的所有其他调试信息。

撰写回答