从名称中带有点的文件夹导入 - 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中带参数的错误导入 main

Anaconda/Python 站点包子文件夹名称中带有波浪号 - 它们是啥?

PowerShell 中的环境变量,名称中带有点 (.)

Python基础滚固导入文件名中带空格与文件名以数字开头的模块

FireDAC (FDQuery) - 名称中带有点的数据库

在Windows上的Python 2中运行名称中带有重音字符的cmd文件