nose-gae引发有关mkstemp和线程的错误

时间:2012-01-30 12:09:51

标签: google-app-engine logging nose

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引发相同的错误。

1 个答案:

答案 0 :(得分:-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',
]

奇怪的错误消失了。现在:)