在Visual Studio的Python工具中调试GAE

1''*_*1'' 6 python google-app-engine visual-studio webapp2 ptvs

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

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)
Run Code Online (Sandbox Code Playgroud)

是否可以在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
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*chr 5

UPDATE似乎现在已经弃用了gcloud预览版,它又回到了旧方法

为了使它适用于gcloud预览(它更新更简单),请替换为:

常规 - >启动文件:

C:\Program Files\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\gcloud\gcloud.py
Run Code Online (Sandbox Code Playgroud)

Debug-> Script Arguments:

preview app run app.yaml --python-startup-script "pydevd_startup.py" --max-module-instances="default:1"
Run Code Online (Sandbox Code Playgroud)

休息与原始答案相同:

原始答案:

我终于运行了:对于格式化的帮助,请看这里,只需复制和粘贴:

创建一个文件以注入远程调试器

  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()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将其保存在您应用的工作目录中

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

在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"
Run Code Online (Sandbox Code Playgroud)

您可能也可以使用.而不是,<path-to-your-app>但我想要安全.

运行调试器

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

启动远程调试器

DEBUG->Attach to Process <Ctrl+Alt+P>
Qualifier: tcp://joshua@localhost:5678 <ENTER>
Run Code Online (Sandbox Code Playgroud)

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

  • 也适用于VS2015社区+ PTVS,+ 1 (2认同)