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

如何在python shell中重新加载类?

徐德海
2023-03-14
问题内容

如果我导入的模块定义了属于同一个包的同名类,则由于父包的__init__.py,它将作为类而不是模块导入。有关详细信息,请在不同目录中查看不同的导入结果。在Python Shell或ipython Shell中,如果我这样做

from MyPak import MyMod

MyModule始终作为Class导入,因此我无法重新加载它(reload()仅适用于模块)。跑

from MyPak import MyMod

再次似乎不更新类定义。有人可以建议一种在python shell中更新类的方法吗?

ps。无需重启python解释器。

pps
。以防万一您掌握了代码并想要对其进行测试:我实际上是在谈论BioPython,并且我正在研究Bio.PDB.PDBParser。我有一个ipython
shell(v0.10)并编辑PDBParser.py。只是没有办法在ipython中重新加载它。

所以这就是我所做的:

# start ipython v0.10
import Bio
from Bio.PDB import PDBParser
p = PDBParser()
s = p.get_structure()
# then I make changes,e.g. simply print some text, in PDBParser.py
del Bio
del PDBParser
del s
import Bio  # or reload(Bio) without deleting all the objects
from Bio.PDB import PDBParser
p = PDBParser()
s = p.get_structure() # expected output after change not seen :(

我看不到打印的文字。更改未以某种方式应用。


问题答案:

我终于找到了答案:

import MyPak
from MyPak import MyMod

编辑后MyPak/MyMod.py的文件,重新装入类MyMod文件MyMod.py,一个需要

import sys
del sys.modules['MyPak.MyMod'] 
reload(MyPak)
from MyPak import MyMod

注意事项

  1. 执行del MyPakdel MyModdel MyPak.MyMod不能解决问题,因为它只是删除了名称绑定。Python仅搜索sys.modules以查看是否已导入模块。在sys.modules和globals()中的发布模块名称中查看讨论。

  2. 当重装MyPak,python尝试执行线from MyMod import MyModMyPak/__init__.py。但是,它MyPak.MyMod在中找到sys.modules,因此即使已更新,也 不会 重新加载。您会发现没有新的生成。MyMod``MyPak/MyMod.py``MyPak/MyMod.pyc



 类似资料:
  • 我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片

  • 问题内容: 我正在尝试实现一些功能,即单击屏幕上的按钮将导致我的[QuerydataTable刷新(因为自创建dataTable以来服务器端数据源可能已更改)。 这是我所拥有的: 但是当我运行它时,它什么也没做。单击按钮时刷新dataTable的正确方法是什么?提前致谢! 问题答案: 您可以尝试以下方法:

  • 问题内容: 我正在使用Java进行项目,因此需要在单击特定按钮后重新加载整个程序。这该怎么做? 问题答案: 尝试 如果仍然无法使用,请在完成上述步骤后尝试

  • 问题内容: 这肯定是一个普遍的问题…而且我觉得在使用Google搜索和SOing之后,我肯定只是没有彻底地环顾四周以获得足够的答案,或者没有人问过这个问题…所以请原谅我。 我正在使用Spring Security和Hibernate等 因此,用户/主要用户已登录并对其个人资料进行了一些更改。 我使用DAO更新配置文件(UserDetails),并且希望我的Principal自动反映此更新。 但是,

  • 问题内容: 关于如何在Node.js中实现文件自动重装的任何想法?每次更改文件时,我都无法重新启动服务器。显然,Node.js的功能不会重新加载文件(如果已经需要),因此我需要执行以下操作: 在 app.js 文件中,我有: 但这也不起作用-我在声明“ require”未定义的语句中遇到错误。正在逃避 app.js ,但不知道node.js全局变量。 问题答案: 一个很好的,最新的替代方法是 :

  • 我的ReactJS组件包含一个iframe。为了响应外部页面中的事件,我需要重新加载iframe。如果用户已经导航到iframe中的另一个页面,我需要将其重置为第一次加载该页面时的URL。此URL在中可用。 (我也在使用TypeScript,如果这有什么不同的话。)