6

在遵循本教程之后,我可以使用 Visual Studio 2012的 Python 工具运行我的 Google App Engine webapp2 应用程序而不会出现问题,甚至可以逐步执行服务器初始化代码,但是我无法让它在获取或发布方法时中断该网站已加载,类似于此视频中显示的方法。当我暂停调试器时,它总是以 wsgi_server.py 中的以下无限循环结束:main()

def _loop_forever(self):
  while True:
  self._select()

def _select(self):
  with self._lock:
    fds = self._file_descriptors
    fd_to_callback = self._file_descriptor_to_callback
if fds:
  if _HAS_POLL:
    # With 100 file descriptors, it is approximately 5x slower to
    # recreate and reinitialize the Poll object on every call to _select
    # rather reuse one. But the absolute cost of contruction,
    # initialization and calling poll(0) is ~25us so code simplicity
    # wins.
    poll = select.poll()
    for fd in fds:
      poll.register(fd, select.POLLIN)
    ready_file_descriptors = [fd for fd, _ in poll.poll(1)]
  else:
    ready_file_descriptors, _, _ = select.select(fds, [], [], 1)
  for fd in ready_file_descriptors:
    fd_to_callback[fd]()
else:
  # select([], [], [], 1) is not supported on Windows.
  time.sleep(1)

是否可以在 PTVS 中的 Google App Engine webapp2 应用程序中设置断点,这些断点是在从 localhost 加载页面时触发的?

编辑:使用 cprcrack 的设置,我能够成功运行 GAE,但是在加载主页时出现错误

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3003, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2862, in _Dispatch
    base_env_dict=env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 719, in Dispatch
    base_env_dict=base_env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1797, in Dispatch
    self._module_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1648, in ExecuteCGI
    app_log_handler = app_logging.AppLogsHandler()
  File "C:\Python\lib\logging\__init__.py", line 660, in __init__
    _addHandlerRef(self)
  File "C:\Python\lib\logging\__init__.py", line 639, in _addHandlerRef
    _releaseLock()
  File "C:\Python\lib\logging\__init__.py", line 224, in _releaseLock
    _lock.release()
  File "C:\Python\lib\threading.py", line 138, in release
    self.__count = count = self.__count - 1
  File "C:\Python\lib\threading.py", line 138, in release
    self.__count = count = self.__count - 1
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_debugger.py", line 557, in trace_func
    return self._events[event](frame, arg)
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_debugger.py", line 650, in handle_line
    if filename == frame.f_code.co_filename or (not bound and filename_is_same(filename, frame.f_code.co_filename)):
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_debugger.py", line 341, in filename_is_same
    import ntpath
  File "C:\Python\lib\ntpath.py", line 8, in <module>
    import os
  File "C:\Python\lib\os.py", line 120, in <module>
    from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
ImportError: cannot import name curdir

发生此错误是因为我需要回滚到 Python 2.5 才能使用旧的 dev_appserver?

4

4 回答 4

5

更新#2

gcloud preview已弃用

它回到原来的方法

更新#1

gcloud preview(它更新更简单),

替换这个:

常规->启动文件:

C:\Program Files\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\gcloud\gcloud.py

调试->脚本参数:

preview app run app.yaml --python-startup-script "pydevd_startup.py" --max-module-instances="default:1"

其余的都与下面的原始答案相同


原始答案:

A.) 创建一个文件来注入远程调试器

  1. 制作一个新的python文件“pydevd_startup.py”

  2. 插入这个:

    import json 
    import sys 
    if ':' not in config.version_id:  
    # The default server version_id does not contain ':'  
        sys.path.append("lib")  
        import ptvsd  #ptvsd.settrace() equivalent  
        ptvsd.enable_attach(secret = 'joshua')  
        ptvsd.wait_for_attach()
    
  3. 将其保存在应用程序的工作目录中

  4. 有关更多信息,请查看我上面提到的 pytool 远程调试文档

B.) 在 VS 2013 中编辑项目设置

现在在 VS 中打开您的项目设置并输入:

General->Startup File: C:\Cloud SDK\google-cloud-sdk\bin\dev_appserver.py
General->Working Directory: .
Debug->Search Paths: C:\Cloud SDK\google-cloud-sdk\lib
Debug->Script Arguments: --python_startup_script=".\pydevd_startup.py" --automatic_restart=no --max_module_instances="default:1" ".\app.yaml"

您可能也可以使用.<path-to-your-app>但我想安全。

C.) 运行调试器

使用Ctrl+F5运行调试器,无需调试。这听起来很奇怪,但我们现在实际上并没有调试,只是运行开发服务器,然后启动我们的脚本来注入调试器代码并等待我们的远程调试器连接,这将在下一步发生

D.) 启动远程调试器

DEBUG->Attach to Process <Ctrl+Alt+P>
Qualifier: tcp://joshua@localhost:5678 <ENTER>

约书亚是你的秘密钥匙。如果你想改变它(你应该),你还必须在 pydevd_startup.py 中改变它。有关更多信息,请参阅 pytool 参考。

F.) 真的很开心!

您现在可以在本地远程调试您的应用程序(呃,很奇怪)。要对此进行测试,您可能应该breakpoint在自己的脚本开头使用 a 。

如果您有任何问题,请询问。最后看起来真的很简单,但要做到这一点很艰难。尤其是因为pytools说了,他们不支持...

G.) 真正开始调试!

http://localhost:8080在浏览器(或您配置应用程序使用的任何其他地址)中打开。现在它应该调用断点。如果您完成并重新加载该站点,它将重新开始。如果你真的想结束调试或更改一些代码,你必须重新启动服务器并再次附加。不要忘记在服务器打开的情况下关闭终端窗口(使用<Crtl+C>

于 2014-07-11T17:31:37.257 回答
2

这是适用于 Python 的 Google App Engine 的一个已知问题:目前,调试不适用于任何调试器。看这里这里这里

于 2013-07-14T15:23:02.340 回答
2

有一种解决方法,但我不知道如何让它适用于 vs 的 python 工具。理论上它应该是可能的。

https://groups.google.com/forum/#!topicsearchin/google-appengine/Boa/google-appengine/-m00Qz4Vc7U

您可能需要本指南才能使其正常工作:

https://docs.google.com/document/d/1CCSaRiIWCLgbD3OwmuKsRoHHDfBffbROWyVWWL0ZXN4/edit#heading=h.fj44xnkhr0gr

于 2013-07-15T16:21:45.040 回答
1

我正在使用旧的 dev_appserver 进行调试,它在类似于你的场景中为我工作。我也遇到了一堆异常,但我可以按照此链接上的说明跳过所有异常(我还必须为一些 ValueError 异常添加“异常”)。

这些是我的项目属性:

常规选项卡:

启动文件:C:\Program Files (x86)\Google\google_appengine\old_dev_appserver.py

工作目录:./

Windows 应用程序:(未选中)

解释器:Python 2.7

调试选项卡:

搜索路径:C:\Program Files (x86)\Google\google_appengine

脚本参数:--use_sqlite ./

解释器参数:(空白)

解释器路径:C:\Python27\python.exe

当不需要断点时,我在 Python Interactive 中使用 DEBUG > Execute Project 运行项目。这样你就不会得到不需要的控制台窗口。

于 2013-07-30T12:00:19.563 回答