重新加载/重新导入使用from * import *导入的文件/类 - python

好吧,正如标题所说,我得到了一组导入,全部导入一个类,都与运行它的脚本位于同一文件夹中:

from lvl import lvl
from get import get
from image import image
from video import vid
from video import MLStripper
from system import system
from setting import setting
from listsearch import lists

python3没有重新加载iirc,但是有imp.reload(),但它似乎不起作用,

它只是抛出一个错误,说它不是一个模块(它是一个类,所以它不起作用)

在导入的那些类中的每个小编辑之后,我将需要重新启动脚本

有没有一种方法可以重新加载/重新导入类以显示编辑的效果,而无需启动脚本或重写大部分脚本,从而使imp.reload()起作用?

python3,linux(但也可以在窗口上使用,则更喜欢)

编辑1:

例如:如果我使用:

import system
system.system.temp()

它返回:

65°C

如果我将其更改为显示°F并使用imp.reload重新加载

imp.reload(system)
system.system.temp()

它返回:

149°F

所以,如果我使用它就可以了

import system as _system
from system import system
system.temp()

它返回:

65°C

然后我将其更改为显示°F并使用imp.reload重新加载

imp.reload(_system)
from system import system
system.temp()

它仍然返回

65°C

但是再次,如果我这样称呼它:

_system.system.temp()

它返回

149°F

idk为什么会这样,但这是导致它在while循环中发生的原因?

编辑2:

文件名:system.py:

更改测试之前:

class system:
  def temp():
    temperature = open("/sys/class/thermal/thermal_zone0/temp","r").read()
    temperature = temperature[:2]
    return(temperature+"°C")

更改测试后:

class system:
  def temp():
    temperature = open("/sys/class/thermal/thermal_zone0/temp","r").read()
    temperature = temperature[:2]
    temperature = str(9.0 / 5.0 * int(temperature) + 32).split(".")[0]
    return(temperature+"°C")

参考方案

您只能reload一个模块:

  参数必须是模块对象,因此它必须已经成功导入。

就您而言,您没有对模块对象的任何引用。即使您不想将其用于其他任何用途,也必须对其进行import处理,只是为了稍后调用reload

另外,在reload之后,您还要重新命名import

  对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,并且如果需要的话,必须在出现它们的每个命名空间中进行更新。

当您执行from foo import bar时,该bar是“模块外部的名称”,因此您必须显式重新绑定它。

如果您考虑一下,它必须以这种方式工作。 reload不能枚举其定义取决于模块以前版本的所有对象来更新它们。即使可能,也可能存在无限循环。如果新版本甚至没有旧版本的类的定义,将会发生什么?还是如果类是动态定义的?

用另一种方式来看,from foo import barimport foo; bar = foo.bar非常相似。 bar是您的命名空间中的名称,而不是foo的命名空间,因此reload(foo)不会使用它。您需要再次复制新的foo.bar

解决所有这些问题的简单方法是在from foo import bar之后重复所有reload行。

对于简单的情况:

import video
from video import MLStripper

# ... later

imp.reload(video)
from video import MLStripper

但是,大多数示例都有明显的命名冲突:from video import video之后,就不能再reload(video)。因此,您需要另一个对video模块对象的引用。

Python为您保留了一个,您可以使用它:

imp.reload(sys.modules['video'])
from video import MLStripper

或者,您也可以使用as子句或仅使用=赋值来为其指定所需的名称。

import video as _video
from video import video

# ... later

imp.reload(_video)
from video import video

从您的评论和已编辑的问题来看,听起来您还有其他问题。让我们使用一种简单的非冲突案例进行讨论。

我相信您实际上正在执行以下操作:

import video
from video import MLStripper

stripper = MLStripper('foo")

# ... later

imp.reload(video)
from video import MLStripper

第一行将成功地重新加载video模块,第二行将其MLStripper类复制到全局变量中,因此您创建的任何新的MLStripper实例都将是新类型。

但这不会影响任何现有的MLStripper实例,例如stripper

就像MLStripper一样,stripper是那些“模块外部的名称”之一。但这实际上更糟。为了对其进行调整,如果新版本的代码从创建之时起生效,reload就必须弄清楚它的状态。显而易见,这是一个无法解决的问题。

如果知道要修补的实例,则可以以与处理类相同的方式有效地处理它们:只需再次创建它们:

imp.reload(video)
from video import MLStripper
stripper = MLStripper('foo")

如果这还不够好,那么您可能想要三种可能的破解方式:

将方法,属性等猴子修补到实例及其__class__中。
直接修补实例的__class__属性,因此从类继承的任何内容现在都将从新类继承。
pickle之前使用reload序列化实例,然后在之后进行反序列化。

在非常简单的情况下,所有这三种方法都可以使用。对于更复杂的情况,您将必须了解自己在做什么。

请注意,您可以将很多这些东西包装到一个函数中,但是您必须了解本地和全局的工作方式(以及导入和重新加载的工作方式),否则最终将使自己困惑。

一个更简单的解决方案是仅创建“转储所有状态”和“加载所有状态”功能。然后,您可以转储所有内容,退出,重新启动和还原。 Python教程和ipython文档都描述了几种替代使用reload的方法。可能值得回头再读一遍。

如何在Windows的Anaconda中添加caffe? - python

我试图在Windows的Anaconda3中使用Caffe,但是当我尝试在iPython中导入caffe时,它显示此错误: ImportError:没有名为caffe的模块我试图添加一个新的名为PYTHONPATH的系统变量,如下所示:C:\Users\Hadi\Anaconda3;C:\Projects\caffe\python\caffe;C:\Proj…

x import y和import x.y之间的区别 - python

所以我很困惑,因为区别是什么...这里有一些代码来显示我的困惑:>>> import collections.OrderedDict as od Traceback (most recent call last): File "<stdin>", line 1, in <module> Impor…

即使import语句在先前的代码中工作,Python模块在import语句中也有属性错误 - python

我有一个项目突然停止正常运行。我不知道为什么,因为我事先没有对其进行任何更改。构建它时出现以下错误:Traceback (most recent call last): File ".\engine.py", line 7, in <module> from controllers.game_panel_controller …

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…