Python:选择要以runtype [dynamic]导入的包

时间:2014-03-11 09:39:12

标签: python import python-import

我的API [port.py]具有两个不同硬件平台的相同接口:mips和powerpc。通过相同的接口我的意思是类是相同的,他们的方法是相同的,但实现不同。

mips/port.py
powerpc/port.py

使用这些API的程序应该与特定平台分离,除了导入包之外,代码看起来完全相同。如何动态选择平台,如下面的代码,其中platform是全局设置(mipspowerpc)或类似的内容:

from [platform].port import PortCli

我尝试使用if进行导入,但由于我可能需要添加其他平台,因此看起来很糟糕并且扩展性不佳。

谢谢

与Eduard讨论后更新:

以下代码实际上是import mips.port

的类似物
import importlib
platform = 'mips'
myModule = importlib.import_module(platform + '.port')
myModule.Port().PrintMe()

没关系,但我需要在任何地方添加myModule。是否可以使用类似替代from mips.port import Port

1 个答案:

答案 0 :(得分:1)

基于Python核心开发人员Andrey Svetlov的post

我建议您在不同的目录中添加特定于平台/硬件的Python模块,并在运行时将此模块附加到sys.path

例如: 我们有一个包

    • __初始化__。PY
    • a.py
    • x86_64的
      • b.py
    • I386
      • b.py

__init__.py将包含以下内容:

import sys
import platform
from os.path import join, dirname
__path__.append(join(dirname(__file__), platform.machine()))

使用这种方法,公共代码位于包中,而平台特定的分布在子目录中。

请注意x86_64i368没有__init__.py模块。

导入所需的模块b

from package import b