我开始在Windows上进行Pyramid开发。我安装了Python 2.7。我使用virtualenv为我的Pyramid应用程序创建了一个漂亮的沙盒。我还在Eclipse Indigo上创建了PyDev 2.4。我还为我的virutalenv创建了一个单独的PyDev解释器,因此它应该可以访问所有目录。
我设置了一个新的调试配置。
当我点击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上投放
即使它说服务器正在运行,但事实并非如此。没有什么东西在听那个港口。
有关如何解决此问题的任何想法?调试当然没有必要,但我喜欢有一个完全设置的开发环境。谢谢!
答案 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