2010-10-30 115 views
5

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

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

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

我的问题是:以相对方式获取所有模块列表的最佳方式是什么?我的意思是,如果我知道驱动程序位于..drivers中,是否有办法在该子包中获取整洁的模块列表?举例说明:通常我只需拨打from ..drivers import driver_name即可导入模块,但由于我不能保证在的软件包目录中,不能只有我们os才能得到模块名称列表。在任何情况下,任何想法(甚至可能是一个更好的方式来完成我想要的 - 可加载的“驱动程序”),将不胜感激。

回答

3

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

我认为一个更强大的方法是为您的程序列出所有已知的驱动程序,也许还有一些元数据,以便用户可以更轻松地选择它们。如果您知道可能的位置,您可以让驾驶员自行注册,或自行注册。使驱动程序自行注册的一个优点是,您可能在驱动程序包目录中具有非驱动程序的python文件。

编辑

对于司机“注册自己,”你可能会做这样的事情:

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

然后在你自己的包,提供一个更新列表中的“注册”功能的司机,他们的位置和描述(一个简单的文本文件应该为初学者做)。

+0

我该如何去让驾驶员注册自己?用小脚本实现它们以查找我的软件并注册它们自己?或更聪明的东西? – crasic 2010-10-30 10:30:54

+0

感谢您的好建议,我实现了一个简单的文本文件来保存驱动程序名称和元数据,可能不是最好的长期解决方案(当人们可能想要导入外部驱动程序时),但是现在确实可以像魅力一样工作。 – crasic 2010-10-30 22:10:38

3

pkgutil其中有iter_modules。 (注:The Python 2 documentation没有提到的功能,但它工作得很好,我对Python的2.6。)

你也可以做到这一点使用__file__os.pathos.listdir手动。

0

为什么不制作所有驱动程序的包?然后,你可以

import drivers 
drivers.load("device1") 

其中load功能维护设备名称的映射在封装模块?然后,您可以在需要时动态导入每个必需的模块...