[英]Imports inside package now that __init__.py is optional
我正在構建一個包含要運行的腳本的包。 它們直接在腳本下導入子文件夾中包含的模塊。 既然在 Python 3.3 之后不需要__init__
,那么正確的文件結構和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
請注意,一個.
import 總是需要from .<where> import <name>
形式。 否則它不會產生有效的名稱。 以下應該可以工作,假設您通過python3 -m src.script
運行script.py
- 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
文件,但如果您的包不是命名空間,最好添加它們。 否則,其他具有相同名稱的類似構造的包可能會插入到您的包中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.