【发布时间】:2013-12-26 19:58:18
【问题描述】:
我编写了一个使用嵌套包的程序,但我认为这不是“官方”方式。
我将公共对象和变量存储在__init__ 中,我也想从包的模块(one.py、two.py)和顶级脚本(main.py)中获取这些对象和变量。如果我将我的包嵌套在另一个包中,那么我必须手动重写导入,例如从 import pack 到 import nested.pack。
我尝试了 from . import * (AttributeError: 'module' object has no attribute 'one') 和 import ..pack (SyntaxError: invalid syntax) 但都没有奏效。也不是这个:
import importlib
pack = importlib.import_module( __package__ )
输出是:
Traceback (most recent call last):
File "main.py", line 2, in <module>
import pack.one
File "pack\one.py", line 4, in <module>
pack = importlib.import_module( __package__ )
File "python32\lib\importlib\__init__.py", line 117, in import_module
if name.startswith('.'):
AttributeError: 'NoneType' object has no attribute 'startswith'
我认为我为 import 语句“深度独立”找到了一个很好的解决方案,但这可能不是一种常见的方式。
_______________________________ DIRECTORY TREE _______________________________
main.py
pack/
__init__.py
one.py
subpack/
__init__.py
two.py
___________________________________ FILES ____________________________________
__ MAIN.PY ____________________________
import pack
import pack.one
import pack.subpack
import pack.subpack.two
print( '__ MAIN.PY ____________________________' )
print( 'PACK.VAR', pack.var )
print( 'SUBPACK.VAR', pack.subpack.var )
pack.one.fnc()
pack.subpack.two.fnc()
__ PACK/__INIT__.PY ___________________
import sys
__all__ = [ 'one' ]
var = sys.modules[ __name__ ]
__ PACK/ONE.PY ________________________
import sys
pack = __import__( '.'.join( __name__ .split( '.' )[0:-1] ) )
def fnc():
print( '__ ONE.PY _____________________________' )
print( sys.modules[ __name__ ] )
print( 'PACK.VAR', pack.var )
__ PACK/SUBPACK/__INIT__.PY ___________
import sys
__all__ = [ 'two' ]
var = sys.modules[ __name__ ]
__ PACK/SUBPACK/TWO.PY ________________
import sys
subpack = __import__( '.'.join( __name__ .split( '.' )[0:-1] ) )
def fnc():
print( '__ TWO.PY _____________________________' )
print( sys.modules[ __name__ ] )
print( 'SUBPACK.VAR', subpack.var )
___________________________________ OUTPUT ___________________________________
__ MAIN.PY ____________________________
PACK.VAR <module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'>
__ ONE.PY _____________________________
<module 'pack.one' from 'e:\laci\0_uj\korrekcio\tmp\pack\one.py'>
SUBPACK.VAR <module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'>
SUBPACK.VAR <module 'pack.subpack' from 'e:\laci\0_uj\korrekcio\tmp\pack\subpack\__init__.py'>
__ TWO.PY _____________________________
<module 'pack.subpack.two' from 'e:\laci\0_uj\korrekcio\tmp\pack\subpack\two.py'>
SUBPACK.VAR <module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'>
制作“深度无关”包__init__.py导入的好解决方案是什么?
我在带有 Python 3.2.5 的 Windows 7 上尝试了上述代码。
【问题讨论】:
标签: python import module nested package