簡體   English   中英

空的__init__.py是否會干擾直接導入並導致錯誤?

[英]Will an empty __init__.py interfere with a direct import and cause an error?

某些代碼已經過重構,可以直接導入,而還原的提交等也有些混亂。我遇到了ImportError並且對Python導入系統了解得不夠,不知道為什么。 已經花了很長時間研究分支之間的比較,但是找不到它是什么。

根據以下目錄結構,

our_project/
    __init__.py
    directory1/
        __init__.py
        file1.py
        file2.py
        file3.py
    directory2/
        __init__.py
        file3.py
        file4.py
        file5.py
    directory3/
        __init__.py
        file6.py
        file7.py
        file8.py

除了our_project/目錄中的其中一個包含一些代碼的__init__.py之外,所有__init__.py都是空的。

directory3/file7.py頂部的以下內容directory3/file7.py正常工作,並且不會導致ImportError

from out_project.directory1.file1 import my_function

還是你需要寫

from our_project.directory1 import my_function嗎?

只是覺得這個空的__init__.py某種程度上干擾了事物。

您的文件夾布局建議的頂級軟件包是our_project 這意味着包含它的文件夾應該在Python搜索路徑中。

然后,您可以使用from our_project.directory1.file1 import my_function從任何地方進行絕對from our_project.directory1.file1 import my_function

my_project.directory3.file7模塊,您可以改用相對導入, from ..directory1.file1 import my_function

但是,如果您將file7.py作為腳本運行(例如,在命令行上使用python file7.py ,則相對導入可能不起作用。 通常,按文件名運行程序包中的腳本是一個壞主意,因為解釋器將無法判斷它們應放在程序包層次結構中的何處。 而是使用python -m our_project.directory4.file7以其絕對名稱運行模塊。

這是python文檔的鏈接,其中包含一個不錯的教程,其中對所有內容進行了說明。

初始化 .py文件只是告訴python將目錄視為python軟件包,因此我相信您將如何導入取決於系統上安裝了哪些軟件包(它會搜索PYTHONPATH來查找已安裝的軟件包/模塊)。 如果僅安裝了示例中的our_project軟件包,則需要像

 from our_package.directory1.file1 import my_function

您也可以使用相對導入,無論安裝了什么,都可以使用

  from .directory1.file1 import my_function

有關軟件包的文檔位於: https : //docs.python.org/3/tutorial/modules.html#packages

有關模塊搜索路徑的信息位於: https : //docs.python.org/3/tutorial/modules.html#the-module-search-path

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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