在不激活虚拟环境的情况下运行Python3
问题描述:
我的目标是在AWS Lambda服务上运行Python 3代码,该服务当前仅支持Python 2.7。这些是我所做的步骤。在不激活虚拟环境的情况下运行Python3
因为我在Mac上运行,设置泊坞窗图像similar到AWS LAMBDA Linux实例。
Build来自Docker镜像源码的Python3。
在泊坞窗映像创建一个虚拟的环境,并将其复制到我的项目。
-
AWS Lambda需要您创建代码的zip并将其上载到其服务。对于这个原型,我有三个神器拉链在根
-
handler.py
:这是一个Python 2.7文件。当发生事件时(例如,在S3存储桶中创建新文件时),此文件中的handler
函数将由AWS Lambda服务执行。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
。为了简洁起见,我已经拿出了使用它的代码,但我确实需要它,并且正在使用来提取它。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
文件夹。这是从泊坞窗镜像复制的虚拟环境文件夹。
-
当我运行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\'
注:
-
如果我删除代码和
handler
功能在handler_python3.py
执行,它显示以下纳克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实例。
答
创建虚拟环境不会复制/usr/local/lib/python3.6
目录中的所有模块。我不得不复制所有文件。