导入时将Python模块重新路由到另一个目录(子版本)

问题描述 投票:1回答:1
mypkg/
├── mypkg-1_0_0/
│   ├── __init__.py
├── __init__.py

以上目录是我的modules目录外观的示例。主模块mypkg包含所有子版本。当我执行import mypkg时,__init__文件用于在运行目标版本__init__文件并将属性设置为globals()]时将导入重定向到正确的版本。

__init__.py中的mypkg外观如下:

def __load():
    import os

    pkgrelease = "mypkg-1_0_0"

    if pkgrelease:
        current_path = __path__[0]

        new_path = os.path.join( current_path, pkgrelease )
        init_path = os.path.join( new_path, "__init__.py" )

        __path__[:] = [new_path]

        initf = open( init_path )
        exec compile( initf.read(), init_path, "exec" ) in globals()
        initf.close()

    else:
        raise ImportError( "Could not find [%s] package version" % os.path.basename(__path__) )

__load()

del __load

python2中,这很好用,程序包被重定向到版本1_0_0,并且在__version__中保留并设置了该版本__init__文件中的globals()之类的东西。但是我也知道,有一种更好的方法可以实现我在这里想要实现的交叉兼容。由于exec编译语句,这在python3中不起作用。

mypkg /├──mypkg-1_0_0 /│├──__init__.py├──__init__.py上面的目录是我的modules目录的示例。主模块mypkg包含所有子版本。当我这样做时...

python python-3.x python-import compatibility
1个回答
0
投票

我发现了一个可以同时在py2 / 3上使用的解决方案。只需调整exec函数以接受globals()参数即可。显示为here in the docs。这是修改后的代码:

© www.soinside.com 2019 - 2024. All rights reserved.