[英]How do I use Grequests on AWS Lambda?
我在Python
中有一個Lambda
函數,該函數使用幾個具有二進制依賴性的庫: numpy
, scipy
, Pillow
等。過去,我已經在Amazon Linux
上成功編譯了它們並將其部署到Lambda
。
不過,我最近將Grequest
添加到了一堆依賴項中,並且它拋出的錯誤似乎與Grequest
。 關於這個話題的其他問題導致了死胡同,所以我把帽子戴上了。
第一個錯誤是簡單的Grequests requires gevent
或類似的東西。 為了解決這個問題,我嘗試在Amazon Linux
實例上運行pip install gevent --no-binary :all:
將其與我的代碼捆綁在一起並上傳到Lambda。 這對錯誤沒有影響。
然后,我從gevent
庫下載了src
並使用make
對其進行了編譯(存儲庫README中的命令引發了我未記錄的錯誤)。 這產生了一個egg
文件,我將其轉換為whl
文件並運行pip install gevent.whl -t .
。
我將生成的代碼與lambda.zip
捆綁在一起並上傳了。 這導致了一個新錯誤 : module initialization error: lib/libptf77blas.a.gz: invalid ELF header
libptf77blas.a.gz
是我的lambda.zip
中的lib
文件夾中的文件。 此文件夾包含幾個.so
和.a
文件,這些文件是我在組裝numpy
, scipy
, Pillow
等時在AWS Linux上構建的。
據我所知,這是numpy
的依賴項。 我不明白的部分是:我的函數使用numpy
(大概libptf77blas.a.gz
在添加grequests
之前就grequests
。
因此,我假設有關編譯gevent
打破了我其他與binary
相關的lib的依賴關系,或者gevent
本身需要libptf77blas.a.gz
並對其發現的內容感到困惑。
我在gevent
依賴的.so
文件上運行了ldd
,但沒有一個引用libptf77blas.a.gz
。 但是,我是一位正在編譯的新手,所以這幾乎沒有定論。
我想實現Grequests
啟用的並行上載,但尚不清楚如何解決此問題,或不清楚要使用哪個替代庫(我通常寫JS,因此Python是第二語言)。
問題完全是與無關的用戶造成的愚蠢用戶錯誤-按照OP中的步驟操作,您應該會很好。
或者只是使用我在github上發布的grequests
的副本。 這是一個zip
其中grequests
在Amazon Linux實例上編譯的grequests
, gevent
和greenlet
。 它可以在我的Lambda Function
正常工作。
正如其他問題所述,您需要確保使用Amazon Linux Image編譯libev等二進制文件。 基本上,您需要在運行Amazon Linux的計算機上安裝numpy和Grequests之類的東西,因為它們使用需要編譯的C代碼。
該問題中的教程鏈接對於從源代碼構建事物看起來非常不錯,盡管比您需要的更多。
如果您不熟悉編譯二進制文件,則應閱讀一些有關make的知識,並查看一些示例,例如構建curl 。 由於您使用的是Amazon Linux,因此它使用yum,並且與CentOS非常相似。
您也許可以通過在CentOS的docker映像上的venv上的venv中安裝numpy和Grequests並將其內容壓縮成類似於本教程的方式來擺脫,但是我首先要使用Amazon的映像啟動EC2實例並安裝東西就像本教程一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.