2012-01-30 12 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 

私はそれをきれいにすることができる方法はありますか?

更新

私は試験前に環境変数を設定するスクリプトをハッキング:

export TESTING=1 
nosetest --with-gae 

その後、私のアプリケーションコードで、

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

しかし、結局のところ、import osも原因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))。私は自分のコードを変更することでそれらの周りを回ることができましたが、それは非常にhackishと不安定な感じ。 –

+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 

重要なことは、2番目の例外であることが判明しました。私は/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ノーズテストの問題を修正するものではありませんが、うまくいきました。 –

関連する問題