既然__init__.py是可选的,请更正导入和包结构

时间:2018-07-18 08:55:01

标签: python python-3.x packages python-import

我正在构建一个包含要运行的脚本的软件包。它们将脚本中直接包含在子文件夹中的模块导入。既然__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!

我想我需要拥有 some __init__文件,但是那是什么?在哪里?非常感谢您的帮助,我对包装了解不多。

此外,如果这样做使事情变得更容易,我当然愿意提出改变结构的建议。

1 个答案:

答案 0 :(得分:2)

缺少的__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文件,但是如果您的程序包不是名称空间,则最好添加它们。否则,可能会将其他相同名称的类似构造的包装插入您的包装中。