我正在构建一个python 3.6
AWS Lambda部署包,并且遇到了SQLite
的问题。
在我的代码中,我使用的是nltk
,其中一个文件中有一个import sqlite3
。
到目前为止采取的步骤:
python
/home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so
Unable to import module 'my_program': No module named '_sqlite3'
将SQLite预编译的二进制文件从sqlite.org
Unable to import module 'my_program': dynamic module does not define module export function (PyInit__sqlite3)
我的设置:Ubuntu 16.04
,python3 virtual env
AWS lambda env:python3
我如何解决这个问题?
发布于 2017-06-14 06:01:36
根据您对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的问题,则此技术可能会起作用。
发布于 2017-10-30 09:07:25
这是一个小技巧,但我通过将CentOS 7上的Python3.6中的_sqlite3.so
文件直接放到使用Zappa to AWS部署的项目的根目录中,从而使其正常工作。这应该意味着,如果您可以将_sqlite3.so
直接包含到压缩包的根目录中,那么它应该可以工作,因此可以通过cpython
中的以下行将其导入
https://github.com/python/cpython/blob/3.6/Lib/sqlite3/dbapi2.py#L27
不是很漂亮,但很管用。您可以在此处找到_sqlite.so
的副本:
https://github.com/Miserlou/lambda-packages/files/1425358/_sqlite3.so.zip
祝好运!
发布于 2017-05-20 02:21:36
这不是一个解决方案,但我有一个解释。
Python3在标准库中支持sqlite (稳定到pip知道并且不允许安装pysqlite)。但是,这个库需要在运行时在机器上安装sqlite开发人员工具( libs)。默认情况下,Amazon的linux AMI没有安装这些程序,而AWS Lambda是在其上运行的(裸机ami实例)。不过,我不确定这是否意味着没有安装sqlite支持,或者只是在添加库之前无法工作,因为我测试的顺序不对。
Python2在标准库中不支持sqlite,你必须使用像pysqlite这样的第三方库来获得支持。这意味着可以更容易地构建二进制文件,而不依赖于机器状态或path变量。
我的建议是,如果可以的话,只在python2.7中运行该函数(并使您的单元测试变得更加困难:/)。
由于这些限制(它是在3中烘焙到python的基本库中的东西),创建一个对lambda友好的部署包变得更加困难。我唯一能建议的就是申请AWS向lambda添加这种支持,或者(如果你可以不用实际使用nltk中的sqlite块)复制anaconda,将具有正确方法和属性的空库放入其中,但实际上什么也不做。
如果您对后者感兴趣,可以查看anaconda安装中的任何fake/_sqlite3
文件。这样做只是为了避免导入错误。
https://stackoverflow.com/questions/44058239
复制相似问题