python-3.x - 使用 Python 3 在 AWS lambda 上出现 sqlite3 错误

标签 python-3.x amazon-web-services sqlite aws-lambda

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

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

到目前为止采取的步骤:

  1. 部署包只有我在根目录中使用的 python 模块。我收到错误: 无法导入模块“my_program”:没有名为“_sqlite3”的模块

  2. /home/my_username/anaconda2/envs/py3k/lib/python3.6/lib-dynload/_sqlite3.so 中的 _sqlite3.so 添加到包根目录中。然后我的错误变成了:

    无法导入模块'my_program':动态模块没有定义模块导出函数(PyInit__sqlite3)

  3. 将来自 sqlite.org 的 SQLite 预编译二进制文件添加到我的包的根目录,但我仍然收到第 2 点的错误。

我的设置:Ubuntu 16.04python3 虚拟环境

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

这会为 sqlitesqlite.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/

相关文章:

linux - centos 7 AWS(使用 ssh key 和密码登录)

c - 如何使用 SQLite3 C 接口(interface)将 CSV 文件加载到主内存数据库中?

android - 如何在 SQLite (Android) 中存储可绘制/位图

python - 在支持 Python3 的 Windows 上安装 GVIM?

python-3.x - 在 apache Airflow 中初始化数据库时出错,下面是附加的错误,谢谢

python - 如何在 Kivy 中输入文本后调用函数

android - 这是从数据库填充 ListView 的可能方法吗?

linux - Python 服务器在 Linux 中不工作

python - 无法安装 AWS Elastic Beanstalk CLI(Win10、Python 3.6、Pip 9.0.1)

linux - 检查是否使用IP地址或域名访问网站