作者:herozhx | 来源:互联网 | 2023-02-03 15:27
我正在构建一个python 3.6
AWS Lambda部署包,并面临着一个问题SQLite
.
在我的代码中,我使用的是nltk
其中一个import sqlite3
文件.
到目前为止的步骤:
部署包只有我在根目录中使用的python模块.我收到错误:
Unable to import module 'my_program': No module named '_sqlite3'
将_sqlite3.so添加/home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so
到包根目录中.然后我的错误改为:
Unable to import module 'my_program': dynamic module does not define module export function (PyInit__sqlite3)
将SQLite预编译的二进制文件添加sqlite.org
到我的包的根目录,但我仍然得到错误点#2.
我的设置:Ubuntu 16.04
,python3 virtual env
AWS lambda env: python3
我该如何解决这个问题?
1> AusIV..:
根据您使用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,那么这种技术可能会起作用.
2> FlipperPA..:
这有点像黑客,但我已经通过将_sqlite3.so
CentOS 7上的Python 3.6文件直接放入使用Zappa部署到AWS的项目的根目录来实现这一点.这应该意味着,如果您可以_sqlite3.so
直接包含在ZIP的根目录中,它应该可以工作,因此可以通过以下行导入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
祝好运!
3> apathyman..:
这不是解决方案,但我有一个解释原因.
Python 3在标准库中支持sqlite(稳定到点知道并且不允许安装pysqlite).但是,此库要求sqlite开发人员工具(C libs)在运行时位于计算机上.亚马逊的Linux AMI默认没有安装这些,这是AWS Lambda运行的(裸ami实例).我不确定这是否意味着没有安装sqlite支持,或者只是在添加库之后才会工作,因为我以错误的顺序测试了一些东西.
Python 2不支持标准库中的sqlite,你必须使用像pysqlite这样的第三方库来获得支持.这意味着可以更轻松地构建二进制文件,而不依赖于机器状态或路径变量.
我的建议,我已经完成了,我只是在python 2.7中运行该函数(如果可以的话)(并使你的单元测试更加困难:/).
由于这些限制(它是3中融入python的基础库的东西),因此创建一个lambda友好的部署包更加困难.我唯一可以建议的是请求AWS向lambda添加支持,或者(如果你可以在没有实际使用 nltk中的sqlite片段的情况下逃脱)通过放置具有正确方法和属性的空白库来复制anaconda但是不要实际上做任何事.
如果您对后者感到好奇,请查看fake/_sqlite3
anaconda安装中的任何文件.这个想法只是为了避免导入错误.