【发布时间】:2017-03-02 06:49:14
【问题描述】:
我的目标是在 AWS Lambda 服务上运行 Python 3 代码,该服务目前仅支持 Python 2.7。这些是我已经完成的步骤。
由于我在 Mac 上工作,因此将 docker 映像 similar 设置到 AWS Lambda Linux 实例。
Build Python3 来自 docker 映像上的源代码。
在 docker 镜像中创建一个虚拟环境并将其复制到我的项目中。
-
AWS Lambda 要求您创建代码的 zip 并将其上传到他们的服务。对于这个原型,我有一个根目录有三个工件的 zip
-
handler.py:这是一个 Python 2.7 文件。此文件中的handler函数将在事件发生时由 AWS Lambda 服务执行(例如,在 S3 存储桶中创建新文件时)。def handler(event, context): execution_uuid = uuid.uuid4() commands = ''' source venv/bin/activate && venv/bin/python3.6 ./handler_python3.py --execution_uuid {ex_uuid} '''.format(ex_uuid=str(execution_uuid)) p = Popen('/bin/bash', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) stdout, stderr = p.communicate(commands) pprint(stdout) pprint(stderr) -
handler_python3.py。这是之前的handler.py文件调用的Python3 文件。注意正在读取的execution_uuid。为简洁起见,我删除了使用它的代码,但我确实需要它,我正在使用argparse来提取它。def read_execution_uuid(): import argparse parser = argparse.ArgumentParser() parser.add_argument("--execution_uuid", required=True) args = parser.parse_args() return args.execution_uuid def handler(event, context): import sys print(sys.path) if __name__ == '__main__': execution_uuid = read_execution_uuid() handler(event, context)-
venv文件夹。这是我从 docker 镜像中复制的虚拟环境文件夹。
-
-
当我运行 AWS Lambda 服务时,我收到以下错误
Traceback (most recent call last):
File "./handler_python3.py", line 38, in <module>
execution_uuid = read_execution_uuid()
File "./handler_python3.py", line 7, in read_execution_uuid
import argparse
ModuleNotFoundError: No module named \'argparse\'
注意事项:
-
如果我删除
argparse代码并执行handler_python3.py中的handler函数,它将显示sys.path的以下值['/var/task', '/var/runtime', '/var/task/venv/lib/python36.zip', '/var/task/venv/lib/python3.6', '/var/task/venv/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6', '/var/task/venv/lib/python3.6/site-packages']
注意事项:
- 我可以显式安装 argparse。但我不想这样做。
- 注意python 2.7 文件
handler.py中的source venv/bin/activate命令。尽管它在本地工作,但它不适用于 Lambda 实例。
【问题讨论】:
标签: python virtualenv aws-lambda