python - 从名称中带点的文件夹导入 - Python

标签 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 因为文件夹名称包含点。

附言绝对路径未知,因为此代码应该部署到 AWS lambda

最佳答案

问题是模块的 .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')),使结构更简洁一些,如果这对您很重要的话。

关于python - 从名称中带点的文件夹导入 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39541446/

相关文章:

amazon-ec2 - 使用 boto3 从 AWS Lambda 启动 EC2 实例时超时

aws-lambda - Serverless 如何知道在哪里可以找到 serverless.yml?

python - 同名的相对和绝对导入导致 "AttributeError: ' 模块'对象没有属性...”

python - 如何计算排序列表中两个值之间的元素?

aws-lambda - VPC 中的 Lambda 删除需要更多时间

python - PyObject_GetAttrString C++ 函数返回 NULL : Unable to call Python functions from C++

python - float 总和 : unexpected result

python - SSL错误 : Python Server Failure (HTTP_REQUEST _ssl. c:777)

python - RLock 是 Lock 的明智默认设置吗?

Python - 一次从文件中读取 1000 行