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

2024-05-14 21:03:21 发布

您现在位置:Python中文网/ 问答频道 /正文

mypkg/
├── mypkg-1_0_0/
│   ├── __init__.py
├── __init__.py

上面的目录是我的模块目录的一个示例。主模块mypkg包含所有子版本。执行import mypkg操作时,__init__文件用于将导入重定向到正确的版本,同时运行目标版本__init__文件并将属性设置为globals()

下面是mypkg中的__init__.py的样子:

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,版本__init__文件中的__version__之类的内容被保留并设置在globals()中。但我也知道有一种更好的方法可以实现我在这里试图实现的目标,那就是交叉兼容。由于exec compile语句,这在python3中不起作用


Tags: 模块文件pathpy版本目录newinit
1条回答
网友
1楼 · 发布于 2024-05-14 21:03:21

我找到了一个同时适用于py2/3的解决方案。只需调整exec函数以接受globals()an参数。这显示为here in the docs。修订后的守则如下:

def load():
    import os

    pkgrelease = "mypkg-1_0_0"

    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)
    module = compile(initf.read(), init_path, "exec")
    exec(module, globals())
    initf.close()


load()

del load

相关问题 更多 >

    热门问题