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
引发相同的错误。
答案 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',
]
奇怪的错误消失了。现在:)