我不认为这个问题是 PyDev 所独有的,而是任何 python 调试器所独有的。
使用 Eclipse 和 pydev,我无法在 dev_appserver(Google 应用程序引擎开发服务器)进程中中断我的 WSGI 处理程序。我不是 100% 确定,但我认为这是 GAE 1.7.6 或 1.7.7 的回归,因为我几乎可以肯定在升级到 1.7.7 之前我能够调试我的代码
GAE 似乎创建了一个不受 PyDev 控制的新进程('_python_runtime.py')。我找不到任何证据表明 PyDev 中提供了“调试子进程”功能,所以现在我有点迷失了。
查看 GAE 代码(1.7.7),似乎子进程是在 tools/devappserver2/http_runtime.py 中创建的,它调用safe_subprocess.py/start_process
.
胡闹我也没有看到任何明显的方法: 1. 告诉 GAE 从同一进程中的服务器到用户处理程序。2. 告诉 GAE 将新项目的命令行从 更改python _python_runtime.py
为python pydev.py ... --file _python_runtime.py
(即使那样,也不确定 PyDev 是否能够接受它)。
有什么建议吗?这真的是回归吗?
编辑(部分答案):
这是部分答案。在 SDK 1.7.6 中,Google App Engine 有一个全新的服务器。服务器现在是一个多进程。主进程产生子进程(称为运行时)来运行 WSGI 处理程序。这些子流程没有被调试。
这一变化在社区中引起了很多反响,但显然 GAE 社区主要生活在 Google Groups 中,而不是 SO(直到昨天我才意识到这一点)。这是讨论的链接:
https://groups.google.com/forum/?fromgroups=#!topic/google-appengine/ep5BWYKpQpU
基本上有两种解决方案:
最简单的做法是使用旧服务器,从 1.7.7 开始,它仍然可用。而不是 dev_appserver.py,只需启动 old_dev_appserver.py。在 Eclipse PyDev 中,转到 Debug Configuration...,并将“Main Module”替换为 $(GOOGLE_APP_ENGINE)/old_dev_appserver.py,然后启动,就好像新服务器从未发生过一样。此解决方案显然存在运行较旧服务器的缺点,并且不知道此设置将保持多长时间。
第二个解决方案涉及更多一点,我还没有完全破解它。它基于 PyDev 的远程调试功能,以及在运行过程开始时告诉 GAE 运行脚本的能力。所以这是如何做到的:
- 创建一个脚本并将其命名为:gae_runtime_startup.py。放是某处(下)。
- 在全局 PyDev 首选项中(Window menu -> Preferences -> PyDev -> Interpreter Python -> String Substitution Variables,添加一个新的 PYDEV 变量,并将值设置为 eclipse 的 PyDev 插件(在我的计算机中是 c:\eclipse\插件\org.python.pydev_2.7.1.2012100913)。
- 在项目属性中,将 ${PYDEV}/pysrc 添加到 PYTHONPATH。这样,您就可以导入 pydevd
- 您需要告诉 GAE 运行 gae_runtime_startup.py。转到启动器,并将以下选项添加到命令行(调试配置 -> 参数):--python_startup_script=<完整路径>/gae_runtime_startup.py --max_server_instances=1
- 启动 PyDev 远程服务器。
# gae_runtime_startup.py
import pydevd;
pydevd.settrace()
一些相关链接: