我正在构建一个包含要运行的脚本的软件包。它们将脚本中直接包含在子文件夹中的模块导入。既然__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__
文件,但是那是什么?在哪里?非常感谢您的帮助,我对包装了解不多。
此外,如果这样做使事情变得更容易,我当然愿意提出改变结构的建议。
答案 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.py
或python3 -m script
的身份运行,则不能使用相对导入。在这种情况下,只有绝对导入有效。
import sub.module
from sub import module
from sub.module import *
import parent_module
虽然不需要__init__.py
文件,但是如果您的程序包不是名称空间,则最好添加它们。否则,可能会将其他相同名称的类似构造的包装插入您的包装中。