Python:我如何用包外的修改版本覆盖包中的一个模块?
我想用我自己的模块版本更新python包中的一个模块,条件如下:Python:我如何用包外的修改版本覆盖包中的一个模块?,python,django,Python,Django,我想用我自己的模块版本更新python包中的一个模块,条件如下: 我希望更新后的模块位于原始软件包之外(要么因为我无法访问软件包源,要么因为我想在单独的回购协议中保留我的本地修改,等等) 我想要导入引用原始包/模块的语句,以解析为我的本地模块 下面是我想使用django的细节做的一个例子,因为这就是我遇到这个问题的原因: 假设这是我的项目结构 django/ ... the original, unadulterated django package ... local_django/
- 我希望更新后的模块位于原始软件包之外(要么因为我无法访问软件包源,要么因为我想在单独的回购协议中保留我的本地修改,等等)
- 我想要导入引用原始包/模块的
语句,以解析为我的本地模块
django/
... the original, unadulterated django package ...
local_django/
conf/
settings.py
myproject/
__init__.py
myapp/
myfile.py
然后在myfile.py中
# These imports should fetch modules from the original django package
from django import models
from django.core.urlresolvers import reverse
# I would like this following import statement to grab a custom version of settings
# that I define in local_django/conf/settings.py
from django.conf import settings
def foo():
return settings.some_setting
我可以用myproject/\uuuuu init\uuuuuuuuuuuupy
中的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?有没有一种更“pythonic”的方法来实现这一点
更新-我为什么要这样做
我认为这是有道理的
- 我正在一台在全球预先安装了django的服务器上启动一个由django支持的网站。在这种情况下,我无法修改实际的django源代码
- 我的django项目使用第三方可重用应用程序,我不想在所有要导入的应用程序中更改
导入
,例如mycustomsettings
。我想让可重用的应用程序不知道我已经更改了django.conf.settings的实现
在这种特殊情况下,最好按照规定的步骤进行操作
在一般情况下,弄脏进口商品肯定会让你的读者(可能是你)感到困惑。改变类行为的python方法是子类和重写。也许你可以利用这个项目,它提供了一个dbsettings
应用程序,它
。。。允许使用设置的占位符
在Python中定义,而它们的值
由工作人员在
服务器已启动并正在运行。许多的
值类型可用,并且
每个映射到一个本地Python类型,因此
模型方法和其他Python代码
可以作为标准类访问它们
属性
在这方面也作出了许多努力
减少此功能的开销,
因此,只需查询数据库
在每次服务器重新启动期间,以及
仅当值
他们自己也在更新
注意:这不是作为一个目标
替换settings.py。这是
为预期值而设计
根据客户的需求进行更改
网站或其用户,以便
改变不需要太多的时间
重新启动。settings.py仍然是
设置的位置将
仅因项目而异
一种看待它的方式是
settings.py用于那些
需要从技术人员处获取
透视图(数据库连接,
已安装的应用程序,可用
中间件等),而dbsettings是
最适合那些
因组织政策而需要
(配额、最低要求等)。
这样,程序员就可以维护
技术要求,而
管理员维护组织结构
政策
该项目由Marty Alchin(编写了Pro Django书籍)编写,不需要对Django代码进行任何更改——它是一个标准的Django应用程序
import local_django.conf
import django.conf
django.conf.settings = local_django.conf.settings
模块是单例的。模块仅初始化/加载一次。在导入使用django.conf.settings的模块以获取更改之前,需要执行此操作
阅读此链接了解更多信息,以了解django是否有一种更标准的方法,因为文档特别建议不要采用我在上面为设置对象显示的方法。
对于其他对象和模块,它应该可以正常工作。只需在sys.modules中设置条目,然后再导入其他内容:
import sys
import myreplacement
sys.modules["original"] = myreplacement
然后,当有人“导入原件”时,他们会得到您的版本
如果要替换子模块,可以按如下方式执行:
import sys
import thepackage
sys.modules["thepackage"].submodule = myreplacement
sys.modules["thepackage.submodule"] = myreplacement
然后“从包导入子模块”或“导入包.子模块”将给出“myreplacement”。我大约在两三天前被介绍过这一点,但实现这一点的一种技术就是使用Python虚拟环境。这允许您指定正在使用的Python版本以及要安装的模块版本,并且能够相对轻松地在不同版本和项目之间交换;它还允许您安装Python系统,否则您可能没有安装某些东西所需的权限
您可以从中了解有关virtualenv的更多信息
还有一个“VirtualNVRapper”软件包,它提供了更容易在环境之间交换的工具
诚然,我在这方面没有太多经验,我在试图理解如何用定制版本覆盖Python标准库时发现了这个问题,所以它并不完美。但我仍然对它指定您安装的内容的能力印象深刻,具体到单个模块的版本 谢谢msw。但我不想创建自己的设置,我想改变django围绕设置的核心行为,例如,将一些设置存储在数据库中,并通过管理员使其可编辑。为了澄清这个问题,我在问题中添加了一些基本原理。我确实想对其进行子类化和重写,但我想在位于原始包目录结构之外的文件中这样做django values很好。我以前用过。但我并不是在寻找一个特定于django设置的解决方案。我只是举个例子。我希望通过pythons import.Awesome了解这是否可行。不知道有那么容易。谢谢。使用django.conf.settings的示例是一个不合适的示例,因为django使用getter和setter自动用本地设置覆盖全局设置。django文档明确地说不要做我在那个例子中所做的事情,beca