Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:我如何用包外的修改版本覆盖包中的一个模块?_Python_Django - Fatal编程技术网

Python:我如何用包外的修改版本覆盖包中的一个模块?

Python:我如何用包外的修改版本覆盖包中的一个模块?,python,django,Python,Django,我想用我自己的模块版本更新python包中的一个模块,条件如下: 我希望更新后的模块位于原始软件包之外(要么因为我无法访问软件包源,要么因为我想在单独的回购协议中保留我的本地修改,等等) 我想要导入引用原始包/模块的语句,以解析为我的本地模块 下面是我想使用django的细节做的一个例子,因为这就是我遇到这个问题的原因: 假设这是我的项目结构 django/ ... the original, unadulterated django package ... local_django/

我想用我自己的模块版本更新python包中的一个模块,条件如下:

  • 我希望更新后的模块位于原始软件包之外(要么因为我无法访问软件包源,要么因为我想在单独的回购协议中保留我的本地修改,等等)
  • 我想要导入引用原始包/模块的
    语句,以解析为我的本地模块
下面是我想使用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