从名称中包含点的文件夹导入 - Python

时间:2016-09-16 23:41:02

标签: python python-2.7 aws-lambda pymysql

我有一个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

1 个答案:

答案 0 :(得分:3)

问题是没有使用模块的.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

使用此方法,您可以将依赖项安装到分发zip文件根目录中的site-packages目录中(os.getcwd()变为os.path.join(os.getcwd(), 'site-packages')),使结构更清晰,如果这对你很重要。