在AWS Lambda中组织外部依赖项

时间:2018-07-31 22:06:03

标签: python amazon-web-services aws-lambda

我对python相对较新,而对Lambda则较新。我创建了一个lambda函数,该函数需要一些外部依赖项(elasticsearchelasticsearch-curator)。

我的根文件夹称为index_curator,其中有一个单独的python文件main.py。我按照亚马逊instructions的规定通过pip安装了依赖项,例如

pip install elasticsearch elasticsearch-curator -t /path/to/index_curator

此根目录和许多子目录中现在有许多其他文件,这并不奇怪,因为这些依赖性很大。对于其他使用此程序包的人来说,很难区分我编写的文件和外部依赖项。例如:

index_curator/
    dateutil/
    click/
    idna/
    main.py    <-- the only file I wrote
    README
    LICENSE
    six.py
    ...

有没有办法将所有这些外部依赖项转移到一个子文件夹中,例如

index_curator/
    /external/
        dateutil/
        click/
        idna/
        README
        LICENSE
        six.py
    main.py    <-- the only file I wrote

为完整起见,main.py中的导入为:

from elasticsearch import Elasticsearch, RequestsHttpConnection
import curator

任何指针将不胜感激。

1 个答案:

答案 0 :(得分:0)

从代码中分离外部依赖绝对是最佳实践。您可以通过多种方式在python中实现此目标。

默认情况下,python在指定的here位置搜索模块。要指定其他位置(即您的external依赖文件夹),必须将此新位置添加到python路径。您可以在main.py中执行以下操作:

import sys, os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'external')))

然后,您将能够照常导入所有依赖项,因为解释器将在运行时检查附加文件夹:

from elasticsearch import Elasticsearch, RequestsHttpConnection
import curator

有关更多详细信息,请查看答案here

由于您的代码将是lambda函数,因此您将始终拥有一个处理程序。但是对于更一般的情况,或者如果您开始编写多个文件,并且还需要管理这些文件中的外部依赖项,则可以选择维护一个context.py文件,该文件将设置依赖项路径以及所有类似的导入方式:

import sys, os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'external')))
import elasticsearch
import context

然后在文件中,您可以使用以下命令进行调用:

from context.elasticsearch import Elasticsearch, RequestsHttpConnection
import context.curator