在python的子包内加载特定模块

时间:2018-07-16 16:12:39

标签: python python-3.x

我的项目中具有以下目录结构

-serviceProvider
   __init__.py
   api.py
   -service1
       __init__.py
       service.py
       api.py
   -service2
       __init__.py
       service.py
       api.py
   -service3
       __init__.py
       service.py
       api.py
   -service4
       __init__.py
       service.py
       api.py

用户将仅导入serviceProvider / api.py文件并访问服务提供的其余功能。

我打算使用一种注册机制,通过该机制,一旦用户导入了serviceProvider软件包,所有的服务软件包也将被加载并注册到提供商。

我的问题是,一旦加载了主要的serviceProvider,我应该使用什么机制来加载所有子包中的所有service.py文件?

我在网上找到的一种解决方案是使用pkgutil。

https://michaelheap.com/python-dynamically-load-all-modules-in-a-folder/

此解决方案要求在每个子包init.py文件中指定给定的代码片段。.还有其他我可以使用的机制吗?

1 个答案:

答案 0 :(得分:0)

您可以使用模块 init .py文件以外的任何机制来完成此操作。

您可以在子模块 init .py中导入所需的不同函数或类,然后从父模块中导入它们。例如,在service1.__init__.py中,您可以导入已编写的不同python文件。看起来像:

from service1 import service, api

这将使您可以将它们导入serviceProvider.__init__.py,看起来像(包括所有服务)

from service1 import service as service1, api as api1
from service2 import service as service2, api as api2
from service3 import service as service3, api as api3
from service4 import service as service4, api as api4

然后在serviceProvider.api中,可以通过在其中调用新名称来导入那些已命名的导入,例如:

from serviceProvider import service1, api1, service2, api2

您需要为它们指定唯一的名称,以便您可以轻松地对其进行命名。这也会导入python文件及其所有功能,因此您可以在代码中说

service2.some_function(arguments)

您还可以通过在serviceProvider.__init__.py中指定要导入的内容来仅导入特定的函数或对象:

from service1.service import my_function
from service1.api import ApiClass as ApiClass1
from service2 import service as service2, api as api2
from service3 import service as service3, api as api3
from service4 import service as service4, api as api4