现在 __init__.py 是可选的,在包内导入

Imports inside package now that __init__.py is optional

我正在构建一个包含脚本的包 运行。它们导入包含在脚本正下方的子文件夹中的模块。现在 __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!

我想我需要 一些 __init__ 文件,但那是什么,在哪里?非常感谢任何帮助,我对包装了解不多。

此外,我当然乐于接受改变结构的建议,如果这能让事情变得更容易的话。

缺少 __init__.py 不是问题 - 您使用的是过时的相对导入。

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

请注意,. 导入始终需要 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.pypython3 -m script,则不能使用相对导入。在这种情况下,只有绝对导入才有效。

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

虽然您不需要 __init__.py 文件,但如果您的包不是命名空间,最好添加它们。否则,其他类似构造的同名包可能会插入到您的包中。