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

Fel*_*lix 7 python package python-import python-3.x

我正在构建一个包含要运行的脚本的包。它们导入脚本正下方的子文件夹中包含的模块。既然__init__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!
Run Code Online (Sandbox Code Playgroud)

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

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

Mis*_*agi 4

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

import sub.module         # implicit relative import - py2 only
from . import sub.module  # explicit relative import
Run Code Online (Sandbox Code Playgroud)

请注意,.导入始终需要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
Run Code Online (Sandbox Code Playgroud)

python3 script.py如果您以普通或 方式运行python3 -m script,则无法使用相对导入。在这种情况下,只有绝对导入才有效。

import sub.module
from sub import module
from sub.module import *
import parent_module
Run Code Online (Sandbox Code Playgroud)

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