2015-10-19 143 views
2

您好我打算使用AWS lambda,我需要打包我的依賴庫。他們建議的方式是使用pip install --target將所有依賴關係加載到一個位置並在稍後進行捆綁。pip安裝到目標目錄失敗

但是,我正在嘗試使用PIL庫來處理jpgs,我正在使用枕頭,這是PIL的主動維護叉。

這是我做了什麼,使其工作:

$ virtualenv env 
$ source env/bin/activate 
(env)$ pip install pillow 
... 
    changing mode of /home/~/lambdaEnv/bin/pilconvert.py to 775 
    changing mode of /home/~/lambdaEnv/bin/pilprint.py to 775 
Successfully installed pillow-3.0.0 
(env)$ python 
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from PIL import Image 
>>> 

和它的工作完美,但是,當我使用target它以一種不可思議的方式出錯了。誰可以幫我這個事?

... 
changing mode of /tmp/tmpbbKMTP/bin/pilconvert.py to 775 
    changing mode of /tmp/tmpbbKMTP/bin/pilprint.py to 775 
Successfully installed pillow-3.0.0 
Exception: 
Traceback (most recent call last): 
    File "/home/~/lambdaEnv/lib/python2.6/site-packages/pip/basecommand.py", line 215, in main 
    status = self.run(options, args) 
    File "/home/~/lambdaEnv/lib/python2.6/site-packages/pip/commands/install.py", line 390, in run 
    for item in os.listdir(lib_dir): 
OSError: [Errno 2] No such file or directory: '/tmp/tmpbbKMTP/lib/python/' 

最後在目標目錄中沒有任何東西。

+0

在與'MySQL-python'相同的情況下得到相同的錯誤 –

回答

0

面對同樣的問題,我沒有考慮使用--target,雖然它可能不會解決問題。原因是PIL使用C python庫,例如_imaging.so,它們在本地庫路徑中再次鏈接庫(默認情況下),並且不存在於lambda環境中。這裏是如何看起來像我的機器上:

$ ldd PIL/_imaging.so 
... 
    libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 
... 

所以,當AWS會盡量import Imaging在你的Python拉姆達,它會拋出一個錯誤:"errorMessage": "Unable to import module 'handler'"與日誌中的原因:

START RequestId: GUID-GUID-GUID Version: $LATEST 
Unable to import module 'handler': libjpeg.so.8: cannot open shared object file: No such file or directory 

這裏是你可以做來克服它什麼(工作我的Ubuntu機器上): 執行PIP(基本上,GCC)鏈接的共享庫依賴於你的拉姆達代碼相同的(相對)目錄:

# in your virtualenv directory: 
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so.8 libjpeg.so.8 
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6 libfreetype.so.6 
ln -s /lib/x86_64-linux-gnu/libpng12.so.0 libpng12.so.0 
source bin/activate 
# Set LD_LIBRARY_PATH to search libraries in the current folder 
LD_LIBRARY_PATH=. 
export LD_LIBRARY_PATH; pip install Pillow 

Yon現在可以通過ldd lib/python2.7/site-packages/PIL/*so驗證依賴關係的位置。確保你得到,例如,libjpeg.so.8 => ./libjpeg.so.8 (0x00007fa115985000)

然後,您需要將根目錄中的所有so文件壓縮到lambda包(當然,保留相同的文件樹)。 就是這樣。

注意:如果要保持根目錄清潔,可以將so文件部署到您的virtualenv的lib/。我沒有驗證它。