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

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

到目前为止采取的步骤:

  • 部署软件包的根目录中只有我正在使用的python模块。我得到错误: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.04python3 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
    

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

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

    09-30 15:15
    查看更多