我正在构建一个python 3.6
AWS Lambda部署软件包,并且遇到了SQLite
的问题。
在我的代码中,我使用的nltk
在其中一个文件中具有import sqlite3
。
到目前为止采取的步骤:
Unable to import module 'my_program': No module named '_sqlite3'
/home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so
中添加了_sqlite3.so到程序包的根目录中。然后我的错误更改为:Unable to import module 'my_program': dynamic module does not define module export function (PyInit__sqlite3)
sqlite.org
添加了SQLite预编译的二进制文件到我程序包的根目录,但是我仍然收到错误,指向第2点。 我的设置:
Ubuntu 16.04
,python3 virtual env
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的不足,那么此技术可能会起作用。