我正在构建一个 python 3.6
AWS Lambda 部署包,并且遇到了 SQLite
的问题。
在我的代码中,我使用了 nltk
,其中一个文件中有一个 import sqlite3
。
到目前为止采取的步骤:
部署包只有我在根目录中使用的 python 模块。我收到错误:
无法导入模块“my_program”:没有名为“_sqlite3”的模块
将
/home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so
中的 _sqlite3.so 添加到包根目录中。然后我的错误变成了:无法导入模块'my_program':动态模块没有定义模块导出函数(PyInit__sqlite3)
将来自
sqlite.org
的 SQLite 预编译二进制文件添加到我的包的根目录,但我仍然收到第 2 点的错误。
我的设置:Ubuntu 16.04
,python3 虚拟环境
AWS lambda 环境:python3
我该如何解决这个问题?
最佳答案
根据您使用 NLTK 执行的操作,我可能已经找到了解决方案。
基础 nltk 模块导入了很多依赖项,其中许多没有被其功能集的大部分使用。在我的用例中,我只使用了 nltk.sent_tokenize
,它对 sqlite3 没有任何功能依赖,即使 sqlite3 作为依赖导入也是如此。
我能够通过更改让我的代码在 AWS Lambda 上运行
import nltk
到
import imp
import sys
sys.modules["sqlite"] = imp.new_module("sqlite")
sys.modules["sqlite3.dbapi2"] = imp.new_module("sqlite.dbapi2")
import nltk
这会为 sqlite
和 sqlite.dbapi2
动态创建空模块。当 nltk.corpus.reader.panlex_lite
尝试导入 sqlite
时,它将获得我们的空模块而不是标准库版本。这意味着导入会成功,但也意味着当 nltk 尝试使用 sqlite 模块时它将失败。
如果您正在使用任何实际上依赖于 sqlite 的功能,恐怕我无能为力。但是,如果您正在尝试使用其他 nltk 功能并且只需要解决缺少 sqlite 的问题,则此技术可能会奏效。
关于python-3.x - 使用 Python 3 在 AWS lambda 上出现 sqlite3 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44058239/