【问题标题】:Run Python3 without activating the virtual environment在不激活虚拟环境的情况下运行 Python3
【发布时间】: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

    1. 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)
      
    2. 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)
      
      1. 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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多