簡體   English   中英

如何編寫嵌套的python包

[英]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 ..packSyntaxError: 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 &lt;module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'&gt;
__ ONE.PY _____________________________
&lt;module 'pack.one' from 'e:\laci\0_uj\korrekcio\tmp\pack\one.py'&gt;
SUBPACK.VAR &lt;module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'&gt;
SUBPACK.VAR &lt;module 'pack.subpack' from 'e:\laci\0_uj\korrekcio\tmp\pack\subpack\__init__.py'&gt;
__ TWO.PY _____________________________
&lt;module 'pack.subpack.two' from 'e:\laci\0_uj\korrekcio\tmp\pack\subpack\two.py'&gt;
SUBPACK.VAR &lt;module 'pack' from 'e:\laci\0_uj\korrekcio\tmp\pack\__init__.py'&gt;

進行“深度獨立”包__init__.py導入的好的解決方案是什么?

我在Windows 7上使用Python 3.2.5嘗試了上述代碼。

您可以相對於執行文件編寫import語句。 例如,如果您的main.py文件是程序的起點,則可以在軟件包one中編寫:

import pack

沒有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM