Отладка GAE в инструментах Python для Visual Studio

Я могу запустить приложение Google App Engine webapp2 с помощью инструменты Python для Visual Studio 2012 без проблем после в этом уроке, и даже шаг через код инициализации сервера, но я не могу заставить его сломать методы 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)

можно ли установить точки останова в приложении Google App Engine webapp2 в PTVS, которые запускаются при загрузке страницы из localhost?

Edit: используя настройки cprcrack, я смог успешно запустить GAE, но при загрузке главной страницы я получаю ошибку

Traceback (most recent call last):
  File "C:Program Files (x86)Googlegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 3003, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:Program Files (x86)Googlegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 2862, in _Dispatch
    base_env_dict=env_dict)
  File "C:Program Files (x86)Googlegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 719, in Dispatch
    base_env_dict=base_env_dict)
  File "C:Program Files (x86)Googlegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 1797, in Dispatch
    self._module_dict)
  File "C:Program Files (x86)Googlegoogle_appenginegoogleappenginetoolsdev_appserver.py", line 1648, in ExecuteCGI
    app_log_handler = app_logging.AppLogsHandler()
  File "C:Pythonliblogging__init__.py", line 660, in __init__
    _addHandlerRef(self)
  File "C:Pythonliblogging__init__.py", line 639, in _addHandlerRef
    _releaseLock()
  File "C:Pythonliblogging__init__.py", line 224, in _releaseLock
    _lock.release()
  File "C:Pythonlibthreading.py", line 138, in release
    self.__count = count = self.__count - 1
  File "C:Pythonlibthreading.py", line 138, in release
    self.__count = count = self.__count - 1
  File "C:Program Files (x86)Microsoft Visual Studio 11.0Common7IDEExtensionsMicrosoftPython Tools for Visual Studio.0visualstudio_py_debugger.py", line 557, in trace_func
    return self._events[event](frame, arg)
  File "C:Program Files (x86)Microsoft Visual Studio 11.0Common7IDEExtensionsMicrosoftPython Tools for Visual Studio.0visualstudio_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.0Common7IDEExtensionsMicrosoftPython Tools for Visual Studio.0visualstudio_py_debugger.py", line 341, in filename_is_same
    import ntpath
  File "C:Pythonlibntpath.py", line 8, in <module>
    import os
  File "C:Pythonlibos.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 ответов


обновление кажется, что gcloud preview теперь устарел, он вернулся к старому методу

чтобы он работал для предварительного просмотра gcloud (он новее и проще), замените это:

Общие->Запуск Файл:

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

Debug - >Аргументы Скрипта:

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

rest совпадает с оригинальным ответом:

ОРИГИНАЛЬНЫЙ ОТВЕТ:

наконец-то работает: Для форматирования помогите увидеть здесь, просто скопируйте и вставьте:

создайте файл для внедрения удаленного отладчика

  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 remote debuging docu, о котором я упоминал выше

изменить настройки проекта в VS

теперь откройте настройки проекта в 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> но я хотел быть в безопасности.

Запустить Отладчик

С Ctrl+Ф5 вы запускаете отладчик без отладки. Это звучит странно, но мы на самом деле не отлаживаем прямо сейчас, просто запускаем dev-сервер, который запускает наш скрипт, чтобы ввести код отладчика и ждать нашего удаленный отладчик для подключения, что произойдет на следующем шаге

Запустить Удаленный Отладчик

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

Иисус - ваш секретный ключ. Если вы хотите изменить его (и вы должны), вы также должны изменить его в pydevd_startup.py - ... См. ссылку pytool для получения дополнительной информации.


Это известная проблема с Google App Engine для Python: в настоящее время отладка не работает ни на одном отладчике. См.здесь, здесь и здесь.


есть обходной путь, но я не знаю, как получить эту работу на инструменты Python для и в теории это должно быть возможно.

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

вам, вероятно, понадобится это руководство, чтобы заставить его работать:

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


я использую старый 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

когда нет необходимости в точках останова, я запускаю проект с DEBUG > Execute Project в Python Interactive. Таким образом, вы не получите ненужную консоль окно.