2017-02-28 75 views
0

我的目标是在AWS Lambda服务上运行Python 3代码,该服务当前仅支持Python 2.7。这些是我所做的步骤。在不激活虚拟环境的情况下运行Python3

  • 因为我在Mac上运行,设置泊坞窗图像similar到AWS LAMBDA Linux实例。

  • Build来自Docker镜像源码的Python3。

  • 在泊坞窗映像创建一个虚拟的环境,并将其复制到我的项目。

  • AWS Lambda需要您创建代码的zip并将其上载到其服务。对于这个原型,我有三个神器拉链在根

    1. 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) 
      
    2. 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) 
      
    3. 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实例。

回答

0

创建虚拟环境不会复制/usr/local/lib/python3.6目录中的所有模块。我不得不复制所有文件。

相关问题