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中不起作用
我找到了一个同时适用于py2/3的解决方案。只需调整
exec
函数以接受globals()
an参数。这显示为here in the docs。修订后的守则如下:相关问题 更多 >
编程相关推荐