[英]how to write nested python package
我寫了一個使用嵌套包的程序,但我認為這不是“官方”方式。
我將公共對象和變量存儲在__init__
,我也想從包的模塊(one.py,two.py)和頂級腳本(main.py)中訪問它們。 如果我要將我的包嵌套在另一個包中,則必須手動重寫導入,例如從import pack
import nested.pack
。
我嘗試from . import *
from . import *
( AttributeError: 'module' object has no attribute 'one'
)和import ..pack
( SyntaxError: invalid syntax
),但是它們都import ..pack
。 也沒有:
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
導入的好的解決方案是什么?
我在Windows 7上使用Python 3.2.5嘗試了上述代碼。
您可以相對於主執行文件編寫import
語句。 例如,如果您的main.py
文件是程序的起點,則可以在軟件包one
中編寫:
import pack
沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.