Python:选择要在runtype中导入的包[动态]
我有两个不同硬件平台的API[port.py]具有相同的接口:mips和powerpc。相同的接口意味着类是相同的,它们的方法是相同的,但是实现是不同的Python:选择要在runtype中导入的包[动态],python,import,python-import,Python,Import,Python Import,我有两个不同硬件平台的API[port.py]具有相同的接口:mips和powerpc。相同的接口意味着类是相同的,它们的方法是相同的,但是实现是不同的 mips/port.py powerpc/port.py 使用这些API的程序应该与特定平台解耦,代码看起来完全相同,只是导入了包。如何动态选择平台,如下面的代码,其中platform是一个全局设置(mips或powerpc)或类似的内容: from [platform].port import PortCli import sys imp
mips/port.py
powerpc/port.py
使用这些API的程序应该与特定平台解耦,代码看起来完全相同,只是导入了包。如何动态选择平台,如下面的代码,其中platform
是一个全局设置(mips
或powerpc
)或类似的内容:
from [platform].port import PortCli
import sys
import platform
from os.path import join, dirname
__path__.append(join(dirname(__file__), platform.machine()))
我尝试使用if
导入,但它看起来很糟糕,而且无法很好地扩展,因为我可能需要添加其他平台
多谢各位
与Eduard讨论后更新:
下面的代码实际上与导入mips.port类似:
import importlib
platform = 'mips'
myModule = importlib.import_module(platform + '.port')
myModule.Port().PrintMe()
这很好,但我需要在所有地方添加myModule。基于Python核心开发人员Andrey Svetlov的经验,是否有可能从mips.port import port中找到类似的替代品
我可以建议您在单独的目录中添加特定于平台/硬件的Python模块,并在运行时将这些模块附加到sys.path
例如:
我们有一个包裹
- 包装
- __初始值
- a、 派克
- x86_64
- b、 派克
- i386
- b、 派克
\uuuu init\uuuuu.py
将包含以下内容:
from [platform].port import PortCli
import sys
import platform
from os.path import join, dirname
__path__.append(join(dirname(__file__), platform.machine()))
使用这种方法,公共代码位于包中,而特定于平台的代码分布在子目录中
请注意,x86\u 64
和i368
没有\uuuu init\uuuu.py
模块
导入所需模块b
from package import b
看看这篇文章:我以前看过,你能推荐一下对我来说有用的吗?你好,爱德华德,谢谢你的回复。实际上,我正在构建测试各种平台功能的软件,所以我在x86 comp上执行它。是否可以将我测试的平台作为变量或任何东西提供给\uuuu init\uuuuuuuuy.py
。我认为这是关于更改platform.machine()
某些全局变量或类似的东西。您可以通过环境变量传递它或从配置文件中读取它。我在x86计算机上工作,我在mips
和powerpc
平台上运行远程测试(使用telnet,com)。我想将mips/powerpc
作为参数传递给测试软件。它与platform.machine()
没有任何关系,正如您可能看到的,在这种情况下,我的答案不符合您的需要。只需将平台作为命令行参数传递,并进行条件导入。例如platform=sys.argv[1]if platform='mips':import mips.port as port elif platform='powerpc':import powerpc.port as port port.run_tests()WBRAs我在问题中写道,我用if/elif
尝试了这种方法。它可以工作,但并不好,因为如果我添加第三个平台,我将不得不更改程序中的许多文件。