9

我不认为这个问题是 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.pypython 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. 最简单的做法是使用旧服务器,从 1.7.7 开始,它仍然可用。而不是 dev_appserver.py,只需启动 old_dev_appserver.py。在 Eclipse PyDev 中,转到 Debug Configuration...,并将“Main Module”替换为 $(GOOGLE_APP_ENGINE)/old_dev_appserver.py,然后启动,就好像新服务器从未发生过一样。此解决方案显然存在运行较旧服务器的缺点,并且不知道此设置将保持多长时间。

  2. 第二个解决方案涉及更多一点,我还没有完全破解它。它基于 PyDev 的远程调试功能,以及在运行过程开始时告诉 GAE 运行脚本的能力。所以这是如何做到的:

    1. 创建一个脚本并将其命名为:gae_runtime_startup.py。放是某处(下)。
    2. 在全局 PyDev 首选项中(Window menu -> Preferences -> PyDev -> Interpreter Python -> String Substitution Variables,添加一个新的 PYDEV 变量,并将值设置为 eclipse 的 PyDev 插件(在我的计算机中是 c:\eclipse\插件\org.python.pydev_2.7.1.2012100913)。
    3. 在项目属性中,将 ${PYDEV}/pysrc 添加到 PYTHONPATH。这样,您就可以导入 pydevd
    4. 您需要告诉 GAE 运行 gae_runtime_startup.py。转到启动器,并将以下选项添加到命令行(调试配置 -> 参数):--python_startup_script=<完整路径>/gae_runtime_startup.py --max_server_instances=1
    5. 启动 PyDev 远程服务器。

    因此,在完成所有这些之后,我在运行时进程上运行的 runtime_startup.py 中获得了一个断点。如果我上栈,我会进入 runtime.py 源代码——所以我认为我的方向是正确的。然而,我在处理程序中设置的断点不会中断 - 所以这条路线对我来说仍然是阻塞的。任何帮助将不胜感激。
# gae_runtime_startup.py
import pydevd; 
pydevd.settrace()

一些相关链接:

  • 谷歌小组讨论:https ://code.google.com/p/appengine-devappserver2-experiment/issues/detail?id=28
  • 来自 Google 的文档解释了如何调试(我的第二种方法):https ://docs.google.com/a/london.org.il/document/d/1CCSaRiIWCLgbD3OwmuKsRoHHDfBffbROWyVWWL0ZXN4/edit
  • 来自 PyDev 的文档,解释了如何设置远程调试器。http://pydev.org/manual_adv_remote_debugger.html
  • 另请参阅下面@Tim Hoffman 的出色评论。

  • 4

    1 回答 1

    2

    这确实是 1.8.3 中修复的回归:https ://code.google.com/p/googleappengine/wiki/SdkReleaseNotes 。

    于 2013-09-01T07:04:01.937 回答