2016-09-16 52 views
1

我有一個Python包看起來像下面這樣:進口 - 的Python

package/ 
├── __init__.py 
├── PyMySQL-0.7.6-py2.7.egg 
├── pymysql 
├── PyMySQL-0.7.x.pth 
└── tests.py 

的文件夾結構不能改變,因爲它是一個第三方庫。

的.pth文件的內容是

import sys; sys.__plen = len(sys.path) 
./PyMySQL-0.7.6-py2.7.egg 
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

最新最好的辦法,包括在tests.py pymysql

我顯然不能使用from PyMySQL-0.7.6-py2.7.egg因爲文件夾名稱中包含點。

P.S.絕對路徑未知,因爲此代碼應該部署到AWS lambda

+0

我會嘗試使用'importlib.import_module'函數。但這不起作用,您需要複製importlib(將其命名爲'myimportlib'),並更改'_bootstrap._find_and_load_unlocked'的路徑分割算法。聽起來很酷的項目,但我不想維護代碼!我粘貼源代碼的網址,請注意這是Python提示,需要運行python 3.6。 https://github.com/python/cpython/tree/master/Lib/importlib – user983716

+0

是的絕對不是我要去的:D –

+0

但顯然它是唯一的解決方案,如果你無法避免的問題。就我個人而言,我相信這會很酷,可能對其他人有用。讓我知道如果你去實施,我想看看如何測試這樣的功能。 – user983716

回答

1

問題是模塊的.pth文件未被使用。 Amazon的Lambda構建說明將您的依賴關係安裝到與Lambda函數文件相同的根目錄中。此目錄未配置爲「站點目錄」(例如virtualenv中的lib/pythonX.Y/site-packages/或全局安裝/usr/lib/pythonX.Y/site-packages(CentOS)或/usr/local/lib/pythonX.Y/dist-packages(Ubuntu)),因此不會評估.pth文件。

您可以將當前工作目錄配置爲站點目錄。 The site module documentation描述創建一個usercustomize.py作爲添加自定義站點目錄的慣例,但Lambda提出了另一個呃逆:要自動評估,該文件預計可在~/.local/lib/pythonX.Y/site-packages中找到。我在我的Lambda .zip文件的根目錄中創建了一個usercustomize.py,並首先在我的Lambda函數處理程序文件中導入它。然後我可以導入使用.pth文件的模塊來配置點符號。

usercustomize.py

import site 
import os 

site.addsitedir(os.getcwd()) 

lambda_handler.py

import usercustomize 
from foo.bar import baz 

使用這種方法,你可以安裝的依賴關係爲site-packages目錄中分發的zip文件的根目錄( os.getcwd()變成os.path.join(os.getcwd(), 'site-packages')),使結構更清潔一些,如果這對你很重要。