从名称中带有点的文件夹导入 - Python
Posted
技术标签:
【中文标题】从名称中带有点的文件夹导入 - Python【英文标题】:import from a folder with dots in name - Python 【发布时间】:2017-01-25 06:29:42 【问题描述】:我有一个 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
【问题讨论】:
我会尝试使用importlib.import_module
函数。但这不起作用,您需要复制 importlib(将其命名为 myimportlib
)包并更改 _bootstrap._find_and_load_unlocked
的路径拆分算法。听起来很酷的项目,但我不想维护代码!我粘贴了源代码的 url,请注意这是 Python 提示,需要 python 3.6 才能运行。 github.com/python/cpython/tree/master/Lib/importlib
是的,绝对不是我想要的:D
但如果您无法避免问题,显然这是唯一的解决方案。就我个人而言,我相信这样做会很酷,并且可能对其他人有用。如果您使用实现,请随时通知我,我想看看如何测试这样的功能。
【参考方案1】:
问题是模块的 .pth 文件没有被使用。 Amazon 的 Lambda 构建说明让您将依赖项安装到与 Lambda 函数文件相同的根目录中。此目录未配置为“站点目录”(例如,虚拟环境中的 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的主要内容,如果未能解决你的问题,请参考以下文章
Anaconda/Python 站点包子文件夹名称中带有波浪号 - 它们是啥?
Python基础滚固导入文件名中带空格与文件名以数字开头的模块