OS X AppEngine - ImportError: No module named _sqlite3
更新:这是我在全新安装的OS X 10.8.3上使用1.8.0 App Engine SDK时遇到的问题。
首先 - 在SO上有一堆关于类似标题的问题。我已经检查过了,我不相信他们回答了我的问题。大多数情况下,他们建议使用libsqlite3-dev并重建python以获取_sqlite3.so,但这已经是应该的位置了:
1 2 3 4 5 6 | $ find / -name _sqlite3.so Password: ... /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/_sqlite3.so /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/_sqlite3.so /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so |
导致app引擎SDK尝试加载该模块的实际代码是:
1 | remaining = TaskSetElement.all().filter('taskSet', ts_key).filter('complete', False).count() |
这是SDK堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <wyn> File"~/dev/myApp/myApp/task.py", line 90, in completeTaskSetElement remaining = TaskSetElement.all().filter('taskSet', ts_key).filter('complete', False).count() File"~/dev/GAE/google_appengine/google/appengine/ext/db/__init__.py", line 2133, in count result = raw_query.Count(limit=limit, **kwargs) File"~/dev/GAE/google_appengine/google/appengine/api/datastore.py", line 1698, in Count batch = self.GetBatcher(config=config).next() File"~/dev/GAE/google_appengine/google/appengine/datastore/datastore_query.py", line 2754, in next return self.next_batch(self.AT_LEAST_ONE) File"~/dev/GAE/google_appengine/google/appengine/datastore/datastore_query.py", line 2791, in next_batch batch = self.__next_batch.get_result() File"~/dev/GAE/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result return self.__get_result_hook(self) File"/Users/colin/dev/GAE/google_appengine/google/appengine/datastore/datastore_query.py", line 2528, in __query_result_hook self._batch_shared.conn.check_rpc_success(rpc) File"~/dev/GAE/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1222, in check_rpc_success rpc.check_success() File"~/dev/GAE/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 570, in check_success self.__rpc.CheckSuccess() File"/Users/colin/dev/GAE/google_appengine/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl self.request, self.response) File"~/dev/GAE/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 200, in MakeSyncCall self._MakeRealSyncCall(service, call, request, response) File"~/dev/GAE/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 234, in _MakeRealSyncCall raise pickle.loads(response_pb.exception()) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1382, in loads return Unpickler(file).load() File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load dispatch[key](self) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1090, in load_global klass = self.find_class(module, name) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1124, in find_class __import__(module) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/__init__.py", line 24, in from dbapi2 import * File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py", line 27, in from _sqlite3 import * File"~/dev/GAE/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 856, in load_module raise ImportError('No module named %s' % fullname) ImportError: No module named _sqlite3 |
我在这一行之前有一堆数据存储区代码执行正常。我直接从命令行或在带有pydev的eclipse中运行dev_appserver.py会遇到同样的问题。
从命令行,一切看起来都很好:
1 2 3 4 5 6 7 8 9 10 | $ python Python 2.7.2 (default, Oct 11 2012, 20:14:37) [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin Type"help","copyright","credits" or"license" for more information. >>> import sqlite3 >>> import _sqlite3 >>> import sys >>> print(sys.path) ['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages'] >>> |
此代码段(在app引擎SDK中运行)会从以下等式中删除应用引擎数据存储区代码:
1 2 3 4 5 6 7 | ... logging.info("Python Version: %s" % sys.version) logging.info(filter(lambda p: 'lib-dynload' in p, sys.path)) import sqlite3 ... </wyn> |
它输出这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 | INFO 2013-05-26 05:55:12,055 main.py:38] Python Version: 2.7.2 (default, Oct 11 2012, 20:14:37) [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] INFO 2013-05-26 05:55:12,055 main.py:40] ['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload'] ERROR 2013-05-26 05:55:12,058 cgi.py:121] Traceback (most recent call last): File"main.py", line 42, in import sqlite3 File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/__init__.py", line 24, in from dbapi2 import * File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py", line 27, in from _sqlite3 import * File"~/dev/GAE/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 856, in load_module raise ImportError('No module named %s' % fullname) ImportError: No module named _sqlite3 |
有什么想法是什么问题?谢谢,
科林
看起来像将
对于我没有受过教育的人来说,看起来
该更改可能允许您在自己的代码中导入_sqlite3,这将是一个错误。也许它需要一种方法来限制导入到dbapi2.py?
从堆栈跟踪中,它显示您正在尝试在main.py中导入sqlite。
你为什么做这个?
appengine不支持导入sqlite。 sqlite是用二进制库实现的,你不能只导入任何旧的二进制文件。另外文件系统是只读的,你不能写入sqlite db。
你提到这是OSX的全新安装。我想知道你是否使用Homebrew来构建Python?做Brew-update或brew-upgrade会给我带来类似的问题,尽管不是GAE。您可能会发现https://github.com/mxcl/homebrew/issues/17312非常有用。