在Python Tools for Visual Studio中调试GAE

6

我能够使用Visual Studio 2012的Python工具运行我的Google App Engine webapp2应用程序,按照这个教程操作后没有问题,甚至可以调试服务器初始化代码,但是当网站加载时,我无法使其在get或post方法处中断,类似于这个视频中展示的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应用程序?

编辑:使用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?


1
我正在使用Python 2.7.5,所以显然不需要回滚。相反,我建议尝试以下步骤:a)如果您正在使用旧版本,请升级到Python 2.7.5。 b)将Python安装在标准的C:\Python27目录中,而不是C:\Python。相应地配置新路径。 c)以不同的方式运行项目(无需使用Visual Studio,使用交互式窗口等)。您收到的错误似乎相当“基本”,是一些无法导入的内置功能,因此可以通过路径和项目属性进行调整。另外,错误中提到了dev_appserver.py,您确定您正在使用old_dev_appserver.py吗? - cprcrack
你的推理非常正确。我确信我正在使用 old_dev_appserver.py。我会在有时间的时候按照你的建议尝试一些调整。 - 1''
4个回答

5
更新#2 不再被支持
回到原有的方法
更新#1 (更新和更简单)
替换此部分:
一般->启动文件:
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. make a new python file "pydevd_startup.py"

  2. insert this:

    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. Save it in your working directory of your app

  4. for more info look at the pytool remote debuging docu I mentioned above
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>

“joshua”是你的秘密钥匙。如果你想要修改它(你应该这么做),你还必须在pydevd_startup.py中进行更改。有关更多信息,请参见pytool参考文献。
F.)真的很高兴!
现在你可以在本地远程调试你的应用程序(呃,很奇怪)。为了测试这个,你可能应该在你自己的脚本开始时使用一个“断点”。
如果你有任何问题,请问。最终看起来似乎非常简单,但要让它正常工作却很困难。特别是因为“pytools”说他们不支持它……
G.)真正开始调试!
在浏览器中打开http://localhost:8080(或任何其他地址,你可以配置你的应用程序使用任何地址)。现在它应该会调用断点。如果你完成了并重新加载网站,它就会重新开始。如果你真的想结束调试或更改某些代码,你必须重新启动服务器并再次连接调试器。不要忘记关闭带有打开服务器的终端窗口(使用)。

1
  1. 在按照以下步骤之前,请确保您已通过身份验证:gcloud auth login。
  2. 请确保从命令行运行应用程序正常工作:gcloud preview app run app.yaml。
  3. gcloud config set project YOURPROJECTNAME。
- Kevin Driedger

2
这是关于Google App Engine for Python已知的问题:目前,任何调试器都无法正常工作。请参见 这里这里这里

2

这不值得我费心,但感谢提供信息。希望 Google 能尽快解决问题。 - 1''
你也可以尝试使用旧的dev_appserver。那可能会起作用。 - dragonx

1

我正在使用旧版的dev_appserver进行调试,并且它在类似于您的场景中对我很有效。我也遇到了一堆异常,但是按照这个链接上的说明,我能够跳过所有异常(我还必须添加 "exceptions" 来处理某些 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 > 在Python Interactive中执行项目。这样做可以避免出现不必要的控制台窗口。

谢谢,这很有用,但我仍然有问题。请查看我原帖的编辑。 - 1''

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接