python中模块的延迟加载

2024-05-16 19:09:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python applet,用于从科学仪器中获取数据,并试图找出管理设备“驱动程序”的最佳方法。在

在我的程序包中,每个驱动程序都由一个单独的python模块表示。它们各自实现了一些标准接口,但主要是一个庞大的命令列表(和函数映射),这些命令(和函数映射)是特定于每个设备和总线的。从长远来看,(我正在为我的实验室小组写这篇文章,并计划支持几十台左右的设备),我希望避免一次将所有设备都加载进去。相反,在运行时,我希望将模块列表读入字典/列表中,然后仅在实际需要时才加载它们。在

当用户想使用新设备时,他选择要使用的驱动程序,并将名称传递给驱动程序子系统,然后由驱动子系统检查该驱动程序是否在已加载模块的列表中,如果没有,它调用__import__函数并加载驱动程序,然后使用该驱动程序实例化一个设备对象并将其交还给用户使用。在

我的问题是:以相对方式获得所有模块列表的最佳方法是什么?我的意思是,如果我知道驱动程序位于..drivers中,有没有一种方法可以获得该子页面中模块的整齐列表?举例说明:通常我只需调用from ..drivers import driver_name来导入模块,但由于我不能保证在包目录中,所以不能仅仅通过os来获取模块名称列表。在

在任何情况下,任何想法(甚至可能是一个更好的方式来完成我想要的-可加载的“驱动程序”)都会很感激。在


Tags: 模块方法函数用户import命令名称程序包
3条回答

如果驱动程序包的位置已知,则可以使用驱动程序文件夹的绝对路径。在

我认为一个更健壮的方法应该是为你的程序列出所有已知的驱动程序,也许还有一些元数据,这样用户可以更容易地选择它们。你可以让司机自己登记,或者自己登记,如果你知道可能的地点。让驱动程序自己注册的一个好处是,驱动程序包目录中可能有驱动程序以外的python文件。在

编辑

对于要“注册”自己的驱动程序,可以执行以下操作:

if __name__ == "__main__":
    import mamapackage
    mamapackage.register("thisdriver", 
               os.path.abspath(__file__), 
               "A description of this driver")

然后在您自己的包中,提供一个“register”函数,该函数更新驱动程序列表及其位置和描述(对于初学者来说,一个简单的文本文件就可以了)。在

为什么不把所有的司机都打包呢?那你就可以了

import drivers
drivers.load("device1")

其中load函数维护设备名到包中模块的映射?然后,您可以在必要时动态导入所需的每个模块。。。在

有一个^{},它有{}。(注意:The Python 2 documentation没有提到这个函数,但它在Python2.6上运行得很好。)

您也可以使用__file__os.pathos.listdir手动完成。在

相关问题 更多 >