2017-02-28 5 views
0

Mein Ziel ist es, Python 3-Code auf dem AWS Lambda-Dienst auszuführen, der derzeit nur Python 2.7 unterstützt. Dies sind die Schritte, die ich gemacht habe.Ausführen von Python3 ohne Aktivierung der virtuellen Umgebung

  • Da ich auf einem Mac arbeiten, Setup ein Docker Bild similar auf die AWS Lambda Linux-Instanz.

  • Build Python3 von der Quelle auf dem Docker-Image.

  • Erstellen Sie im Docker-Image eine virtuelle Umgebung und kopieren Sie sie in mein Projekt.

  • AWS Lambda erfordert, dass Sie eine Postleitzahl des Codes erstellen und diese in den Dienst hochladen. Aus diesem Prototyp habe ich einen Reißverschluss mit drei Artefakte an der Wurzel

    1. handler.py: Dies ist ein Python 2.7-Datei. Die handler-Funktion in dieser Datei wird vom AWS Lambda-Service ausgeführt, wenn ein Ereignis auftritt (z. B. wenn eine neue Datei in einem S3-Bucket erstellt wird).

      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. Dies ist die Python3-Datei, die von der früheren handler.py-Datei aufgerufen wird. Beachten Sie, dass execution_uuid gelesen wird. Ich habe den Code, der es für die Kürze verwendet, herausgenommen, aber ich brauche es und ich verwende argparse, um es zu extrahieren.

      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 Ordner. Dies ist der Ordner für die virtuelle Umgebung, den ich vom Docker-Image kopiert habe.

Wenn ich die AWS Lambda-Service laufen lasse, erhalte ich folgende Fehlermeldung

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\' 

Hinweise:

  • Wenn ich entfernen Sie den argparse Code und die handler Funktion in handler_python3.py ausgeführt wird, zeigt es die folgenden ng-Werte für 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'] 
    

Hinweise:

  • ich argparse explizit installieren können. Aber ich möchte nicht.
  • Beachten Sie den Befehl source venv/bin/activate in der Python 2.7-Datei handler.py. Das funktioniert nicht auf der Lambda-Instanz, obwohl es lokal arbeitet.

Antwort

0

Beim Erstellen einer virtuellen Umgebung werden nicht alle Module aus dem Verzeichnis /usr/local/lib/python3.6 kopiert. Ich musste alle Dateien dort kopieren.

Verwandte Themen