【问题标题】:OS X AppEngine - ImportError: No module named _sqlite3OS X AppEngine - ImportError:没有名为 _sqlite3 的模块
【发布时间】:2013-06-05 02:54:18
【问题描述】:

更新:这是我在全新安装的 OS X 10.8.3 上使用 1.8.0 App Engine SDK 时遇到的问题。

首先 - 关于 SO 有很多类似标题的问题。我已经检查过了,我不相信他们会回答我的问题。大多数情况下,他们建议获取 libsqlite3-dev 并重建 python 以获取 _sqlite3.so,但这已经是它应该在的地方了:

$ 查找 / -name _sqlite3.so 密码: ... /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

导致应用引擎 SDK 尝试加载该模块的实际代码是:


remaining = TaskSetElement.all().filter('taskSet', ts_key).filter('complete', False).count()

这是 SDK 堆栈跟踪:

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

在这行之前我有一堆数据存储区代码执行得很好。我直接从命令行或在 Eclipse 中使用 pydev 运行 dev_appserver.py 时遇到了同样的问题。

从命令行看,一切正常:

$蟒蛇 Python 2.7.2(默认,2012 年 10 月 11 日,20:14:37) [GCC 4.2.1 兼容 Apple Clang 4.0 (tags/Apple/clang-418.0.60)] 在 darwin 输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> 导入 sqlite3 >>> 导入 _sqlite3 >>> 导入系统 >>> 打印(系统路径) ['', '/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'] >>>

此代码 sn-p(在应用引擎 SDK 中运行)从等式中删除应用引擎数据存储区代码:

... logging.info("Python Version: %s" % sys.version) logging.info(filter(lambda p: 'lib-dynload' in p, sys.path)) import sqlite3 ...

它输出这个:

INFO 2013-05-26 05:55:12,055 main.py:38] Python 版本:2.7.2(默认,2012 年 10 月 11 日,20:14:37) [GCC 4.2.1 兼容 Apple Clang 4.0 (tags/Apple/clang-418.0.60)] 信息 2013-05-26 05:55:12,055 main.py:40] ['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload'] 错误 2013-05-26 05:55:12,058 cgi.py:121] Traceback(最近一次通话最后一次): 文件“main.py”,第 42 行,在 导入 sqlite3 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/__init__.py”,第 24 行,在 从 dbapi2 导入 * 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py”,第 27 行,在 从 _sqlite3 导入 * 文件“~/dev/GAE/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py”,第 856 行,在 load_module raise ImportError('No module named %s' % fullname) ImportError:没有名为 _sqlite3 的模块

任何想法是什么问题?谢谢,

科林

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    现在看来,将 '_sqlite3' 添加到 sandbox.py(位于我的机器上的 /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/devappserver2/python)第 742 行的 _WHITE_LIST_C_MODULES 列表对我有用。

    在我未受过教育的眼中,CModuleImportHook 似乎错误地阻止了 _sqlite3 的导入,并且修改它必须返回的任何一项检查None 都会消除该错误。更聪明的人 - 请扩展我所说的或纠正我!

    该更改可能允许您在自己的代码中导入 _sqlite3,这将是一个错误。也许它需要一种方法来限制对 dbapi2.py 的导入?

    【讨论】:

    • 完美!我实际上正在通过 eclipse 运行 linux GAE SDK 发行版,但该解决方案在那里也可以正常工作 - 感谢您的帮助,非常感谢。
    • 很高兴为您提供帮助。这个问题也困扰了我很久!
    【解决方案2】:

    从您的堆栈跟踪中可以看出您正在尝试在 main.py 中导入 sqlite。

    你为什么要这样做?

    appengine 不支持导入 sqlite。 sqlite 是用二进制库实现的,你不能只导入任何旧的二进制文件。另外文件系统是只读的,不能写入sqlite db。

    【讨论】:

    • 据我了解,本地开发服务器中的数据存储是使用 SQLite 实现的,因此导入发生在 App Engine 代码中,而不是他自己的(参见问题中的最后一个代码 sn-p )。
    • 正确 - 应用程序引擎在 sdk 中导入 sqlite 以支持开发数据存储 - 这是我在开发环境中遇到的问题。我自己的代码中的导入只是为了演示问题(它不是用于生产部署),打印出 python 版本并显示路径包含它在我的运行时环境中应该包含的内容。我的测试代码是在第一次查看应用程序引擎代码之后构建的 - 即我正在导入相同的内容以生成相同的错误。
    • 我已经修改了将 SDK 问题放在首位的问题,并包含了来自应用引擎以及我的演示代码的堆栈跟踪。我发现了这个问题,这可能是相关的:code.google.com/p/googleappengine/issues/detail?id=9008 - cmets 于 3 月 26 日和 4 月 27 日出现同样的问题。
    • 好吧,包括一个小的堆栈跟踪,在第 42 行显示一个明确的 sqlite 导入肯定是令人困惑的事情。
    • 也许 - 目的是强调问题出现独立于数据存储。通常在提出问题时,建议是构建一个简单的案例来说明问题。希望我已经对问题进行了充分的编辑以避免进一步的混淆。
    【解决方案3】:

    您提到这是全新安装的 OSX。我想知道你是否使用 Homebrew 来构建 Python?做 Brew-update 或 brew-upgrade 给我带来了类似的问题,虽然不是在 GAE 上。您可能会发现 https://github.com/mxcl/homebrew/issues/17312 很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多