代码之家  ›  专栏  ›  技术社区  ›  Felix

正确的导入和包结构现在是可选的

  •  2
  • Felix  · 技术社区  · 6 年前

    我正在构建一个包含要运行的脚本的包它们导入包含在脚本正下方的子文件夹中的模块。既然 __init__ is not required after Python 3.3 ,正确的文件结构和 import 要声明吗?我不想指定从最上面的文件夹下的导入,只作为一个相对路径,在这里 sub/module 是的。

    这是文件结构的当前状态:

    Root\
        src\
            sub\
                module.py
            script.py
            parent_module.py
        setup.py
    
    # Inside script.py
    import sub.module      # Doesn't work
    from sub import module # Doesn't work
    import src.sub.module  # Does work!
    
    import .sub.module     # Doesn't work
    import .parent_module  # Does work!
    

    我想我需要 一些 _初始__ 文件,但那是什么,在哪里?非常感谢您的帮助,我对包装不太了解。

    另外,如果能让事情变得更简单,我当然愿意接受改变结构的建议。

    1 回复  |  直到 6 年前
        1
  •  3
  •   MisterMiyagi    6 年前

    失踪者 __init__.py 不是问题所在-您使用的是过时的相对导入。

    import sub.module         # implicit relative import - py2 only
    from . import sub.module  # explicit relative import
    

    注意a . 导入始终需要 from .<where> import <name> 形式否则将不会产生有效的名称。假设你跑步的话,下面的方法应该行得通 script.py 通过 python3 -m src.script -ide可能也会这样做。

    from . import sub.module
    from .sub import module
    from .sub.module import *
    from . import parent_module
    

    如果你跑得平平淡淡 python3 script.py python3 -m script ,不能使用相对导入。在这种情况下,只有绝对进口才有效。

    import sub.module
    from sub import module
    from sub.module import *
    import parent_module
    

    当你不需要的时候 __初始年 文件,如果包不是命名空间,则最好添加它们。否则,其他类似构造的同名包可能会插入到您的包中。