簡體   English   中英

由於 __init__.py 是可選的,因此在包內導入

[英]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.pypython3 -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM