【问题标题】:Debugging GAE in Python Tools for Visual Studio在 Visual Studio 的 Python 工具中调试 GAE
【发布时间】:2013-07-13 18:28:51
【问题描述】:

在关注this tutorial 之后,我可以使用Python Tools for Visual Studio 2012 运行我的 Google App Engine webapp2 应用程序而不会出现问题,甚至可以逐步执行服务器初始化代码,但我无法让它在 get 或 post 时中断加载网站时的方法,类似于this video 中显示的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)

是否可以在 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?

【问题讨论】:

  • 我使用的是 Python 2.7.5,所以显然不需要回滚。相反,我会尝试:a) 如果您使用的是以前的版本,请更新到 Python 2.7.5。 b) 在标准 C:\Python27 目录而不是 C:\Python 中安装 Python。相应地配置新路径。 c) 以不同方式运行项目(不使用 Visual Studio,使用交互式窗口...)。您得到的错误似乎很“基本”,一些无法导入的内置功能,因此请使用路径和项目属性。另外,错误中引用了dev_appserver.py,你确定你使用的是old_dev_appserver.py吗?
  • 你的推理很扎实。我确定我使用的是old_dev_appserver.py。当我有时间时,我会根据你的建议尝试解决这个问题。

标签: python visual-studio google-app-engine webapp2 ptvs


【解决方案1】:

更新#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"

您也可以使用. 而不是&lt;path-to-your-app&gt;,但我想保证安全。

C.) 运行调试器

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

D.) 启动远程调试器

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

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

F.) 真的很开心!

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

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

G.) 开始真正的调试!

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

【讨论】:

  • ..1。在按照以下说明进行操作之前,请确保您已通过身份验证:gcloud auth login ..2。确保从命令行运行应用程序有效:gcloud preview app run app.yaml ..3。 gcloud 配置设置项目 YOURPROJECTNAME
【解决方案2】:

这是 Google App Engine for Python 的一个已知问题:目前,调试不适用于任何调试器。请参阅hereherehere

【讨论】:

    【解决方案3】:

    有一个解决方法,但我不知道如何让这个适用于 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

    【讨论】:

    • 这对我来说不值得麻烦,但感谢您提供的信息。希望 Google 能尽快推出修复程序。
    • 您也可以尝试使用旧的 dev_appserver。这可能行得通。
    【解决方案4】:

    我正在使用旧的 dev_appserver 进行调试,它在类似于您的场景中为我工作。我也遇到了一堆异常,但我可以按照this link 上的说明跳过所有异常(我还必须为一些 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

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

    【讨论】:

    • 谢谢,这很有用,但我还是有问题。请查看对我原帖的修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2018-06-07
    • 2011-12-06
    相关资源
    最近更新 更多