在 Python 中递归地重新加载包(及其子模块)

2024-01-04

在 Python 中,您可以按如下方式重新加载模块...

import foobar

import importlib
importlib.reload(foobar)

这适用于.py文件,但对于 Python 包,它只会重新加载包并not任何嵌套的子模块。

带包:

  • foobar/__init__.py
  • foobar/spam.py
  • foobar/eggs.py

Python脚本:

import foobar

# assume `spam/__init__.py` is importing `.spam`
# so we dont need an explicit import.
print(foobar.spam)  # ok

import importlib
importlib.reload(foobar)
# foobar.spam WONT be reloaded.

并不是说这是一个错误,但有时重新加载包及其所有子模块很有用。(例如,如果您想在脚本运行时编辑模块).

在 Python 中递归重新加载包有哪些好方法?

Notes:

  • 为了这个问题的目的,假设最新的Python3.x

    (目前使用importlib)

  • 允许这可能需要对模块本身进行一些编辑。
  • 假设未使用通配符导入(from foobar import *),因为它们可能会使重新加载逻辑变得复杂。

这是一个递归加载包的函数。 仔细检查重新加载的模块是否在使用它们的模块中进行了更新,并检查了无限递归的问题。

一个限制是它需要在包上运行(无论如何,这只对包裹有意义)

import os
import types
import importlib


def reload_package(package):
    assert(hasattr(package, "__package__"))
    fn = package.__file__
    fn_dir = os.path.dirname(fn) + os.sep
    module_visit = {fn}
    del fn

    def reload_recursive_ex(module):
        importlib.reload(module)

        for module_child in vars(module).values():
            if isinstance(module_child, types.ModuleType):
                fn_child = getattr(module_child, "__file__", None)
                if (fn_child is not None) and fn_child.startswith(fn_dir):
                    if fn_child not in module_visit:
                        # print("reloading:", fn_child, "from", module)
                        module_visit.add(fn_child)
                        reload_recursive_ex(module_child)

    return reload_recursive_ex(package)

# example use
import os
reload_package(os)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中递归地重新加载包(及其子模块) 的相关文章

随机推荐

  • 如何访问字典列表中的值?

    假设我有一个包含姓名 年龄和其他信息的字典列表 如下所示 thisismylist Name Albert Age 16 Name Suzy Age 17 Name Johnny Age 13 我将如何使用 for 循环打印以下内容 Alb
  • 使用 swift 语言更改按钮背景颜色

    我是 swift 语言的新手 有人可以告诉我如何使用 swift 语言更改按钮的背景颜色吗 button backgroundColor UIColor blue 或任何其他颜色 red green yellow etc 另一个选项是 RG
  • 当我的代码不在堆栈跟踪中时,如何调试 node.js 错误?

    事实上 我并不完全理解why如果节点是单线程的 我的代码不在堆栈跟踪中 也许我从根本上误解了一些东西 但是为什么我的应用程序有时会因堆栈跟踪而终止 而堆栈跟踪中没有我编写的任何内容 我正在使用 node express 编写一个非常简单的代
  • 在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入

    我正在使用 MVP 模式创建 ASP NET Web 表单应用程序 我的观点的结构是这样的 public partial class ShipperView System Web UI Page IShipperView ShipperPr
  • 使用 Dapper.NET 从存储过程调用获取 Oracle OUT 参数的值

    编辑 使用Execute方法而不是Query QueryMultiple方法 我的OUT SUCCESS参数现在有一个AttachedParam与 与 与OracleParameter有返回值 因此 例如 如果我仅需要检索非游标参数 那么这
  • 打包使用 ImageMagick C API 的应用程序

    我创建了一个使用 ImageMagick C API 的小型 Windows 应用程序 但遇到了一些困难 该应用程序运行良好 我已准备好与我们组织中的其他一些人共享它 但如果不在目标计算机上安装 ImageMagick 我找不到有关分发此类
  • 北欧航空公司。变量是否在数据步骤的每次迭代中都设置为缺失?

    我一直认为数据步骤的每次迭代都将变量设置为缺失 然而 在下面的代码中 变量看起来像是保留了最开始获取的值 我不明白为什么会发生这种情况 data one input x y datalines a 10 a 13 a 14 b 9 run
  • Apache Camel超时同步路由

    我正在 trwing 使用 Apache Camel 构造一个带有超时的同步路由 但我在框架中找不到任何可以解析它的内容 所以我决定建立一个为我制作的流程 public class TimeOutProcessor implements P
  • 为什么 Visual Studio 2019 社区中我的 SSIS 工具箱为空?

    我安装了 Visual Studio 2019 Community 然后安装了数据工具 我可以打开 Integration Services 项目 但当我查看 SSIS 工具箱时 它是空的 我该如何解决 我使用的是 Visual Studi
  • 无法加载 DLL“mqrt.dll”

    我开发了一个 WCF 服务 它作为 Windows 服务托管并公开 MSMQ 端点 我在 SERVER1 上有客户端应用程序 在 SERVER2 上有 MSMQ 和 WCF 服务 当 SERVER1 ClientApp 尝试将消息推送到 S
  • 数据准备好后如何关闭Loader

    In my Ionic 2app 中 我有一个使用服务的组件 该服务使用 http GET 来获取一些数据 然后 我的组件调用该服务 当数据可用时 它会设置并呈现该数据 看起来像以下 export class FarmList implem
  • 在 Access 中导入 Excel 数据

    我的 Access 应用程序中有一个表 需要填充一堆 Excel 文件中的数据 我尝试了这段代码 DoCmd TransferSpreadsheet acImport acSpreadsheetTypeExcel8 strTable str
  • 使用 BouncyCastle 在 C# 中读取 DER 私钥

    我正在尝试使用 BouncyCastle 将 RSA 私钥读入 Net 来测试我之前加密的数据 加密数据使用公钥和 Bouncy Castle 工作正常 我还使用了与下面相同的私钥 DER 格式 在 PHP 应用程序中成功解密我的数据 但我
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 无法从 Windows 主机连接到 WSL2 上的本地服务器

    我有一个Python项目使用waitress在 WSL2 Ubuntu 20 上的本地主机上提供服务 我从 VSCode 远程启动服务器 但无法使用地址从 Windows 上的浏览 器连接到它http 127 0 0 1 5998 http
  • Objective-C:如何替换 HTML 实体? [复制]

    这个问题在这里已经有答案了 我从互联网获取文本 它包含 html 实体 即 oacute 我想将此文本显示到自定义 iPhone 单元格中 我尝试在自定义单元格中使用 UIWebView 但我更喜欢使用多行 UILabel 问题是我找不到任
  • 如何让 favicon.ico 在龙卷风上工作

    龙卷风服务器默认不执行 favicon ico 所以我总是得到这样的信息 W 130626 10 38 16 web 1514 404 GET favicon ico 192 168 1 57 0 57ms 我以各种方式使用 web sta
  • 是否有用于 Java 或 PHP 的 OData 服务器库来公开 OData?

    我想知道是否有或为什么没有适用于 Java 的 ADO NET 数据服务服务器库 我需要从 Java 服务器公开数据库 但我只看到 Microsoft 为 java 提供客户端 而不是服务器部分 当您需要 NET Windows 来公开它时
  • CSS :before 和 :first-child 组合

    我使用以下代码在菜单项之间添加分隔符 navigation center li before content color fff 现在我希望第一个项目前面没有分隔符 所以我想出了以下代码 navigation center li befor
  • 在 Python 中递归地重新加载包(及其子模块)

    在 Python 中 您可以按如下方式重新加载模块 import foobar import importlib importlib reload foobar 这适用于 py文件 但对于 Python 包 它只会重新加载包并not任何嵌套