当前位置: 首页 > 面试题库 >

防止Python缓存导入的模块

惠野
2023-03-14
问题内容

使用IPython在Python中开发大型项目(分为多个文件和文件夹)时,我遇到了缓存导入模块的麻烦。

问题是import module,即使模块已更改,指令也只能读取一次模块!因此,每次更改软件包中的内容时,都必须退出并重新启动IPython。痛苦。

有什么方法可以正确地强制重新加载某些模块吗?还是更好地以某种方式阻止Python对其进行缓存?

我尝试了几种方法,但是没有用。特别是我遇到了非常非常奇怪的错误,例如某些模块或变量神秘地变成等于None

我发现的唯一明智的资源是从pyunit重新加载Python模块,但我尚未对其进行检查。我想要这样的东西。

一个很好的选择是让IPython重新启动,或者以某种方式重新启动Python解释器。

那么,如果您使用Python开发,那么您找到了解决该问题的解决方案吗?

编辑

需要说明的是:显然,我知道一些旧变量取决于模块的先前状态。那个我能接受。为什么在Python中强制重载模块而不发生各种奇怪的错误如此困难?

更具体地说,如果我将整个模块放在 一个 文件中,module.py则可以很好地进行以下操作:

import sys
try:
    del sys.modules['module']
except AttributeError:
    pass
import module

obj = module.my_class()

这段代码很漂亮,我可以在不退出IPython几个月的情况下进行html" target="_blank">开发。

但是 ,每当我的模块由几个子模块组成时,地狱就会崩溃:

import os
for mod in ['module.submod1', 'module.submod2']:
    try:
        del sys.module[mod]
    except AttributeError:
        pass
# sometimes this works, sometimes not. WHY?

无论我的模块在一个大文件中还是在几个子模块中,这对于Python为何如此不同?为什么这种方法行不通?


问题答案:

退出并重新启动解释器是最好的解决方案。任何形式的实时重载或无缓存策略都无法无缝运行,因为不再存在的模块中的对象可能存在,并且模块有时会存储状态,并且即使您的用例确实允许热重载,也是如此,以至于无法考虑值得。



 类似资料:
  • 问题内容: 编写python模块时,是否有办法防止客户端代码两次将其导入?就像c / c ++头文件一样: 非常感谢! 问题答案: Python模块不会多次导入。仅运行两次导入将不会重新加载模块。如果要重新加载它,则必须使用该语句。这是一个演示 是单行的模块 这是多次导入尝试的屏幕记录。

  • 问题内容: 我正在使用PHP开发一个简单的网站。 开发配置: WAMP 生产配置: LAMP 在测试时,我更改了CSS文件,但是当我重新加载页面时,我的浏览器(不确定)仍使用旧的缓存CSS。 我进行了一些谷歌搜索,发现了已经尝试过的其他解决方案 在CSS末尾附加查询 使用(在Firefox中)强制获取资源 禁用Firefox缓存以及使用Firefox加载项。 当这些都不起作用时,我做了更多的谷歌搜

  • 问题内容: 我已经编写了一个Linux驱动程序,该驱动程序ioremaps将特定设备的PCI BAR0导出为sysfs二进制属性,允许用户空间直接控制它。 当我尝试在属性顶部使用MMAP来直接访问该位内存(从Userland程序)时,问题就浮现了。读取可以很好地完成并返回期望值,尽管当我写入该内存时,它似乎被缓存在内核和内存之间的某个地方,而不是传递给GM​​CH根联合体(以及设备)。我想做的是每

  • 我有从我的网页生成的AJAX POST请求,可能有多个POST请求具有相同的POST数据。但是响应可能会有所不同,我希望确保我没有得到这些请求的缓存响应。我需要每个请求点击网页。 我假设对POST请求的响应不会被缓存,这对吗?

  • 我的项目是这样组织的: 在我的calculate.js文件中,我对数据库进行了一个ajax调用,并且我检索了一些值以显示在statistics.html中的表中,但问题是,一旦计算出这些值,这些值就会被缓存,当我再次调用calculate.js以获取其他数据时,第一次显示的信息也是相同的。 但他们还在。我怎么解决这个? 编辑: 这是我的rest控制器:@RequestMapping(value=“

  • 问题内容: RequireJS似乎在内部做一些缓存所需的javascript文件的操作。如果我更改了所需的文件之一,则必须重命名该文件才能应用更改。 将版本号作为查询字符串参数附加到文件名末尾的常见技巧不适用于requirejs 我正在寻找的是一种防止RequireJS必需脚本在内部进行缓存的方法,而不必在每次更新脚本文件时都对其重命名。 跨平台解决方案: 现在,我用于开发和生产期间的自动缓存清除