首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python3在AWS lambda上出现sqlite3错误

Python3在AWS lambda上出现sqlite3错误
EN

Stack Overflow用户
提问于 2017-05-19 05:43:39
回答 8查看 7.7K关注 0票数 23

我正在构建一个python 3.6 AWS Lambda部署包,并且遇到了SQLite的问题。

在我的代码中,我使用的是nltk,其中一个文件中有一个import sqlite3

到目前为止采取的步骤:

python

  • 部署包中只有我在根目录中使用的python模块。我得到了错误:将_sqlite3.so从/home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so Unable to import module 'my_program': No module named '_sqlite3'

  • Added到包根目录中。然后我的错误更改为:

将SQLite预编译的二进制文件从sqlite.org Unable to import module 'my_program': dynamic module does not define module export function (PyInit__sqlite3)

  • Added到我的包的根目录,但我仍然收到错误,因为第2点。

我的设置:Ubuntu 16.04python3 virtual env

AWS lambda env:python3

我如何解决这个问题?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2017-06-14 06:01:36

根据您对NLTK所做的工作,我可能已经找到了一个解决方案。

基本的nltk模块导入了许多依赖项,其中许多并未被其功能集的大部分使用。在我的用例中,我只使用nltk.sent_tokenize,它对sqlite3没有函数依赖,即使sqlite3是作为依赖导入的。

我能够让我的代码在AWS Lambda上运行

代码语言:javascript
复制
import nltk

代码语言:javascript
复制
import imp
import sys
sys.modules["sqlite"] = imp.new_module("sqlite")
sys.modules["sqlite3.dbapi2"] = imp.new_module("sqlite.dbapi2")
import nltk

这将为sqlitesqlite.dbapi2动态创建空模块。当nltk.corpus.reader.panlex_lite尝试导入sqlite时,它将获得空模块,而不是标准库版本。这意味着导入将成功,但也意味着当nltk尝试使用sqlite模块时,它将失败。

如果您使用的功能实际上依赖于sqlite,恐怕我无能为力。但是,如果您正在尝试使用其他nltk功能,并且只需要解决缺少sqlite的问题,则此技术可能会起作用。

票数 37
EN

Stack Overflow用户

发布于 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

祝好运!

票数 9
EN

Stack Overflow用户

发布于 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文件。这样做只是为了避免导入错误。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44058239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档