现在 __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.py
或 python3 -m script
,则不能使用相对导入。在这种情况下,只有绝对导入才有效。
import sub.module
from sub import module
from sub.module import *
import parent_module
虽然您不需要 __init__.py
文件,但如果您的包不是命名空间,最好添加它们。否则,其他类似构造的同名包可能会插入到您的包中。
我正在构建一个包含脚本的包 运行。它们导入包含在脚本正下方的子文件夹中的模块。现在 __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.py
或 python3 -m script
,则不能使用相对导入。在这种情况下,只有绝对导入才有效。
import sub.module
from sub import module
from sub.module import *
import parent_module
虽然您不需要 __init__.py
文件,但如果您的包不是命名空间,最好添加它们。否则,其他类似构造的同名包可能会插入到您的包中。