如何在Eclipse中调试pserve?
我刚开始在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 个回答
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
我还没遇到过那个错误,不过通常在一些难以调试的环境中,可以使用远程调试工具(http://pydev.org/manual_adv_remote_debugger.html)。这样的话,它的工作方式有点像pdb:你可以添加一些代码来设置断点,这样在到达那个断点之前,你的程序就会照常运行。
Pyramid 提供了非常不错的调试支持,主要通过一个叫做 调试工具栏 来实现。
确保你的 development.ini
文件中有这一行
pyramid.includes = pyramid_debugtoolbar
而且这一行没有被注释掉,这样才能启用这个功能。虽然它不支持在 Eclipse 中设置断点,但几乎能提供你需要的所有其他调试信息。