Nose-gae выдает ошибки о mkstemp и многопоточности

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

Есть ли способ, которым я могу очистить это?

Обновлять

Я взломал скрипт, чтобы установить переменную среды перед тестированием:

export TESTING=1
nosetest --with-gae

Затем в моем коде приложения

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

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


person Kit    schedule 30.01.2012    source источник
comment
Иногда я получаю необъяснимые странные ошибки при использовании носа (например, это и это) . Я смог обойти их, изменив свой код, но он кажется очень хакерским и нестабильным.   -  person gaefan    schedule 01.02.2012
comment
@Джефф: Это странно. Например, у меня есть снимок кода, который выдает эти ошибки. В своем расстройстве я взламываю код, иногда перемещая imports. Иногда вылезают ошибки, иногда нет. И когда я сдаюсь и вручную (не используя возвраты коммитов) возвращаю исходный снимок кода, ошибки исчезают :/   -  person Kit    schedule 01.02.2012
comment
@Jeff: Мое последнее решение на данный момент — постепенно переписывать тесты. Пока ошибок еще нет.   -  person Kit    schedule 01.02.2012
comment
Рад, что вы нашли обходной путь. Справедливости ради, это может быть не вина Nose-gae, поскольку это может быть сервер разработки или какой-либо другой пакет (например, веб-тест, который я тоже использую).   -  person gaefan    schedule 01.02.2012
comment
@Jeff, я только что опубликовал хак для него. Посмотрите, работает ли это для вас. Я не использую веб-тест, только нос и нос.   -  person Kit    schedule 02.02.2012


Ответы (1)


Вот временный хак. Я думаю, это связано с тем, как 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',
]

И странные ошибки уходят. Сейчас :)

person Kit    schedule 02.02.2012
comment
Это не устраняет мою последнюю проблему с тестированием носа GAE, но рад, что это работает для вас. - person gaefan; 04.02.2012