Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:选择要在runtype中导入的包[动态]_Python_Import_Python Import - Fatal编程技术网

Python:选择要在runtype中导入的包[动态]

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

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

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
尝试了这种方法。它可以工作,但并不好,因为如果我添加第三个平台,我将不得不更改程序中的许多文件。