现有的 django 模块名称与新的 pip 包冲突

Posted

技术标签:

【中文标题】现有的 django 模块名称与新的 pip 包冲突【英文标题】:existing django module name ***es with new pip package 【发布时间】:2018-11-13 02:29:30 【问题描述】:

我的 django 项目中已经有一个模块,名为(假设)abcxyz。现在经过几个月的项目,我遇到了一个新的 pip 包,它可能对我们正在考虑的一些新功能有用。不幸的是,它在 PyPI 中也注册为 abcxyz - 巧合吧?

通过pip install abcxyz 安装这个新发现的包后,现在当我尝试使用import abcxyz 导入包时,它最终会导入现有的abcxyz 模块(我已经在我的django 项目中使用了几个月)和不是我刚安装的新包。

我该如何解决这个问题?

有什么方法可以在我的项目中以不同的名称安装 PyPI 包,因为我已经将该名称用于现有模块?

或者,

有没有办法在我的import 语句中明确指定我要导入 abcxyz(pip 包)而不是 abcxyz(django 模块)?

【问题讨论】:

如果您有多个同名模块,import abcxyz 将导入sys.path 中最先出现的模块。没有办法重命名已安装的包(嗯,实际上可以重命名 FS 上的文件并调整包元数据,但您肯定不想这样做)。您可以使用from . import abcxyz 切换到您自己的模块的本地导入,并使用全局导入导入已安装的包,但最好的方法是重命名您自己的模块以避免一劳永逸的名称隐藏问题。 顺便说一句,您不需要重命名模块,只需创建另一个包并将模块移动到其中,因此您的导入从 import abcxyz 更改为 import myproj.abcxyzfrom myproj import abcxyz 【参考方案1】:

你可以使用

from __future__ import absolute_import

然后你需要导入你的本地包

from . import abcxyz

以及带有

的 pip 安装包
import abcxyz

【讨论】:

以上是关于现有的 django 模块名称与新的 pip 包冲突的主要内容,如果未能解决你的问题,请参考以下文章

通过 javascript 与新创建的 html 交互

如何查找 pip3 已安装模块的导入名称/密钥

覆盖现有的 Django 模板标签

python 下载新的模块

Django 从使用 password_hash() 的 PHP 站点导入现有的 Ppasswords

nginx+uwsgi+django