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