2012-01-30 38 views
1

Google App Engine無縫地支持Python的logging模塊。但是,當我使用nosetests --with-gae測試我的代碼時,它會引發錯誤。nose-gae引發關於mkstemp和線程的錯誤

爲了說明這一點,如果我沒有一個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以提高相同的錯誤。

+0

我有時會使用鼻子gae是奇怪的錯誤是無法解釋的(如[這個](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))。我已經能夠通過更改我的代碼來解決它們,但它感覺非常不穩定和不穩定。 – 2012-02-01 04:30:44

+0

@傑夫:這很奇怪。例如,我有一個代碼快照,吐出這些錯誤。在我的沮喪之中,我破解了代碼,有時候會移動「import」。有時候錯誤會出現,有時候不會。當我放棄並手動(不使用提交回復)帶回我的原始代碼快照時,錯誤消失:/ – Kit 2012-02-01 05:03:03

+0

我感到你的痛苦。:) – 2012-02-01 05:14:25

回答

-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。添加到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', 
] 

而奇怪的錯誤消失了。現在:)

+1

這並不是解決我最新的GAE鼻子測試問題,但很高興它適合你。 – 2012-02-04 18:47:38