【问题标题】:how to write nested python package如何编写嵌套的python包
【发布时间】:2013-12-26 19:58:18
【问题描述】:

我编写了一个使用嵌套包的程序,但我认为这不是“官方”方式。

我将公共对象和变量存储在__init__ 中,我也想从包的模块(one.py、two.py)和顶级脚本(main.py)中获取这些对象和变量。如果我将我的包嵌套在另一个包中,那么我必须手动重写导入,例如从 import packimport 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 &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导入的好解决方案是什么?

我在带有 Python 3.2.5 的 Windows 7 上尝试了上述代码。

【问题讨论】:

    标签: python import module nested package


    【解决方案1】:

    您可以编写与 ma​​in 执行文件相关的 import 语句。例如,如果您的main.py 文件是您的程序起点,则在包one 内您可以编写:

    import pack
    

    没有任何问题。

    【讨论】:

    • 它可以工作,但我喜欢再次嵌套它(在它上面创建另一个目录),然后我必须重写导入语句:“如果我将我的包嵌套在另一个包中,那么我必须手动重写导入,例如从 import pack 到 import nested.pack。"
    • 您可以随时嵌套它,只需尝试将入口点模块(main.py)保持在整个结构的顶部。这是做你想做的事情的最佳方式。如果您不是编程和应用程序,而是一个包,请使用“main.py”类比并相对于顶级包编写import 语句。
    • 我怎样才能对'main.py'进行相对导入?如果我在目录树的顶部插入一个级别,例如一个名为“nested”的目录,那么我如何制作一个相对导入语句? import pack 必须是 import nested.packmain.py 的位置无关,否则我错了吗?
    猜你喜欢
    • 2023-02-13
    • 2020-03-17
    • 2019-05-28
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多