Нос поднимает ошибки о Mkstemp и Threading - PullRequest
1 голос
/ 30 января 2012

Google App Engine полностью поддерживает модуль Python logging.Однако при тестировании кода с использованием nosetests --with-gae.

возникают ошибки. Чтобы проиллюстрировать, что в любом из моих сценариев приложения нет оператора import logging, я получаю следующее:

..
----------------------------------------------------------------------
Ran 2 tests in 0.068s

OK

Но если я использую import logging, я получаю:

..
----------------------------------------------------------------------
Ran 2 tests in 0.067s

OK
Exception AttributeError: "'NoneType' object has no attribute 'mkstemp'" in <bound method DatastoreFileStub.__del__ of <google.appengine.api.datastore_file_stub.DatastoreFileStub object at 0x101a86750>> ignored
Exception ImportError: 'No module named threading' in <bound method local.__del__ of <_threading_local.local object at 0x103bb4520>> ignored

Можно ли как-нибудь это почистить?

Обновление

Iвзломал скрипт для установки переменной окружения перед тестированием:

export TESTING=1
nosetest --with-gae

Тогда в моем коде приложения

import os
if not bool(os.environ.get('TESTING')):
    import logging

Но, оказывается, import os также вызывает nosetestподнять те же ошибки.

1 Ответ

0 голосов
/ 02 февраля 2012

Вот временный взлом.Я думаю, это связано с тем, что nose-gae готовит среду Google App Engine.Я углубился в код и подключил try except pass фрагменты здесь и там.

Exception AttributeError: "'NoneType' object has no attribute 'mkstemp'" in <bound method DatastoreFileStub.__del__ of <google.appengine.api.datastore_file_stub.DatastoreFileStub object at 0x101a86750>> ignored
Exception ImportError: 'No module named threading' in <bound method local.__del__ of <_threading_local.local object at 0x103bb4520>> ignored

Оказывается, единственное, что имело значение, было второе исключение.Я преследовал его до /usr/local/google_appengine/google/appengine/dist/_threading_local.py.В функции __del__ класса local вокруг строки 237 есть строка import threading.Это не выдает никакой ошибки при запуске сервера разработки.

Но при запуске nosetests --with-gae кажется, что SDK не может получить доступ к стандартным библиотекам Python для динамической загрузки.В экспериментах, приводящих к этой ситуации, я не смог import inspect, чтобы я мог видеть, кто что звонит.Я прибег к ручному расследованию.

Взлом

В /usr/local/google_appengine/dev_appserver.py, найдите переменную EXTRA_PATHS.Добавьте к пути к стандартной библиотеке Python примерно так:

EXTRA_PATHS = [
  DIR_PATH,
  os.path.join(DIR_PATH, 'lib', 'antlr3'),
  os.path.join(DIR_PATH, 'lib', 'django_0_96'),
  os.path.join(DIR_PATH, 'lib', 'fancy_urllib'),
  os.path.join(DIR_PATH, 'lib', 'ipaddr'),
  os.path.join(DIR_PATH, 'lib', 'jinja2'),
  os.path.join(DIR_PATH, 'lib', 'protorpc'),
  os.path.join(DIR_PATH, 'lib', 'markupsafe'),
  os.path.join(DIR_PATH, 'lib', 'webob'),
  os.path.join(DIR_PATH, 'lib', 'webapp2'),
  os.path.join(DIR_PATH, 'lib', 'yaml', 'lib'),
  os.path.join(DIR_PATH, 'lib', 'simplejson'),
  os.path.join(DIR_PATH, 'lib', 'google.appengine._internal.graphy'),
  '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
]

И странные ошибки исчезнут.На данный момент:)

...