2012-01-30 1 views
1

Google App Engine은 Python의 logging 모듈을 완벽하게 지원합니다. 그러나 nosetests --with-gae을 사용하여 코드를 테스트 할 때 오류가 발생합니다. 내 응용 프로그램 스크립트의에 import logging 문이없는 경우 nose-gae가 mkstemp 및 스레딩에 대한 오류를 발생시킵니다.

는 설명하기 위해, 나는 다음과 같은 얻을 :

.. 
---------------------------------------------------------------------- 
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 

정리할 수있는 방법이 있습니까? 그것은 밝혀, import os도 원인, 내 응용 프로그램 코드에서 다음

export TESTING=1 
nosetest --with-gae 

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

을하지만 :

업데이트

나는 시험 전에 환경 변수를 설정하는 스크립트를 해킹 nosetest 동일한 오류가 발생합니다.

+0

때때로 설명 할 수없는 기수를 사용하여 이상한 오류가 발생합니다 (예 : [this] (http://stackoverflow.com/questions/8108130/gae-kinderror-when-getting-entities-via-listproperty) 및 [this] (http://stackoverflow.com/questions/8966685/picklingerror-cant-pickle-class-its-not-the-same-object-as-in-gae)). 내 코드를 변경하여 주변을 둘러 볼 수 있었지만 매우 불안정하고 불안정했습니다. –

+0

@ 제프 : 이상합니다. 예를 들어, 나는 그 오류를 뱉어내는 코드 스냅 샷을 가지고있다. 필자의 좌절감으로이 코드를 해킹하고 때로는'import'를 움직인다. 때로는 오류가 나타나기도하고 때로는 오류가 올 때도 있습니다. 그리고 내가 포기하고 커밋 되돌림을 사용하지 않고 수동으로 원래의 코드 스냅 샷을 가져 오면 오류가 사라집니다./ – Kit

+0

나는 당신의 고통을 느낍니다.:) –

답변

-1

임시 해킹이 있습니다. 이것은 nose-gae이 Google App Engine 환경을 준비하는 방식 때문이라고 생각합니다. 나는 코드를 깊이 파고 여기저기서 tryexceptpass 스 니펫을 여기 저기에 꽂았다.

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에 그것을 쫓아 갔다. local 클래스의 __del__ 함수에서 237 행 주위에 import threading 행이 있습니다. 개발 서버를 실행할 때 오류가 발생하지 않습니다.

그러나 nosetests --with-gae을 실행하면 SDK가 동적 로딩을 위해 Python 표준 라이브러리에 액세스 할 수없는 것으로 보입니다. 이 상황을 이끄는 실험에서 나는 누가 부를 수 있는지 알 수 있도록 import inspect을 할 수 없었습니다. 나는 수동 수사에 의지했다. /usr/local/google_appengine/dev_appserver.py에서

해킹은 변수 EXTRA_PATHS를 찾습니다. 다음과 같이 파이썬 표준 라이브러리의 경로에 추가하십시오.

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', 
] 

그리고 이상한 오류가 사라집니다. 지금은 :)

+1

이것은 최신 GAE-Nose 테스트 문제를 해결하지 못했지만 잘 돌아갔습니다. –