AWS Lambda nicht den Import LXML
Ich bin versucht, das LXML-Modul innerhalb von AWS Lambda und hat kein Glück. Ich heruntergeladen LXML mit dem folgenden Befehl:
pip install lxml -t folder
Herunterladen, um es auf meine lambda-Funktion-Bereitstellung-Paket. Ich Zip den Inhalt meiner lambda-Funktion wie ich es mit allen anderen lambda-Funktionen, und es hochgeladen AWS Lambda.
Aber egal was ich versuche ich bekomme diese Fehlermeldung, wenn ich die Funktion ausführen:
Unable to import module 'handler': /var/task/lxml/etree.so: undefined symbol: PyFPE_jbuf
Wenn ich es lokal, ich habe keine Probleme, es ist einfach wenn ich auf Lambda, wo dieses Problem Auftritt.
- lxml benötigt system-level-Pakete installiert werden, die getan werden muss, auf eine Amazon linux-AMI und in Ihrem lambda-bundle
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stand vor dem gleichen Problem.
Den link gepostet von Raphaël Braud war hilfreich und so wurde es dieses:
https://nervous.io/python/aws/lambda/2016/02/17/scipy-pandas-lambda/
Mit den beiden links konnte ich erfolgreich importieren lxml und andere benötigte Pakete. Hier sind die Schritte, die ich gefolgt:
Führen Sie das folgende Skript zu sammeln Abhängigkeiten:
Handler erstellen und Arbeiter, die Dateien wie angegeben in die link. Beispiel-Inhalt der Datei:
handler.py
worker.py:
Ist hier, wie die Struktur der zip-Datei sieht nach der oben genannten Schritte:
Hoffe, das hilft!
Sich auf diese Antworten habe ich Folgendes gefunden, gut zu arbeiten.
Die Pointe ist hier, dass python-lxml Kompilierung mit statische libs, und die Installation in das aktuelle Verzeichnis statt in site-packages.
Es bedeutet auch, können Sie schreiben Sie Ihre python-code wie gewohnt, ohne die Notwendigkeit für eine deutliche worker.py oder das hantieren mit LD_LIBRARY_PATH
nehmen es auf die nächste Ebene, verwenden Sie die serverlose und docker, alles zu behandeln. hier ist ein blog-post, die dies verdeutlicht:
https://serverless.com/blog/serverless-python-packaging/
AWS Lambda verwenden eine spezielle version von Linux (so weit ich das sehen kann).
Mit "pip install a_package -t-Ordner" ist die gute Sache zu tun, in der Regel wird es helfen, um Paket-Abhängigkeiten innerhalb des Archivs, der gesendet wird, an die Lambda, aber die Bibliotheken und vor allem die binären Bibliotheken haben, um kompatibel mit der version des OS und Python auf lambda.
Können Sie das xml-Modul enthalten in Python : https://docs.python.org/2/library/xml.etree.elementtree.html
Wenn Sie wirklich brauchen, lxml, dieser link gibt einige tricks, wie Sie zu kompilieren shared libraries für Lambda :
http://www.perrygeo.com/running-python-with-compiled-code-on-aws-lambda.html
Ausbau einer bit-Maske auf seine Antwort. Bei der Installation von lxml insbesondere die libxslt und libxml2-Bibliotheken bereits installiert sind, ist auf der AMI, der ausgeführt wird, die AWS lambda. Daher ist es keine Notwendigkeit zum starten eines unterprozesses mit einem anderen LD_LIBRARY_PATH wie in Antwort, ist es jedoch notwendig, zu laufen, pip installieren lxml auf einer AMI-Bild (es könnte möglich sein, um cross-kompilieren als gut, aber ich weiß nicht, wie).
Beachten Sie, dass die letzten Schritte von Marks Antwort ist ausgelassen. Sie können lxml direkt von der python-Datei, die enthält die handler-Methode.