python無法匯入包是什麼原因
基本概念
(推薦教程:)
Python中的包,即包含 __init__.py 檔案的資料夾。
對於Python的包內匯入,即包內模組匯入包內模組,存在絕對匯入和相對匯入問題。
普通 Python 模組的搜尋路徑
1. 在當前模組所在路徑中搜尋匯入模組
2. 在環境變數PYTHONPATH指定的路徑列表中搜尋匯入模組
3. 在sys.path指定的路徑列表中搜尋匯入模組
Python import 的步驟
Python 所有載入的模組資訊都存放在 sys.modules字典結構中,當import一個模組時,會按如下步驟來進行
1. 如果importA,檢查sys.modules中是否已經有A,如果有則不載入,如果沒有則為A建立module物件,並載入A,即可以重複匯入,但只載入一次。
2. 如果from A import B,先為A建立module物件,再解析 A,從中尋找 B 並填充到 A 的 __dict__ 中。
相對匯入與絕對匯入
絕對匯入的格式為 import A.B 或 from A import B,相對匯入格式為 from .A import B 或 from ..X import Y,. 代表當前模組,.. 代表上層模組,... 代表上上層模組,依次類推。
相對匯入對於包的維護優勢
相對匯入可以避免硬編碼帶來的包維護問題,例如我們改了某一層包的名稱,那麼其它模組對於其子包的所有絕對匯入就不能用了,但是採用相對匯入語句的模組,就會避免這個問題。
需要注意:存在相對匯入語句的模組,是不能直接執行的。 例如,對於如下層次結構的 Digital.py 檔案,
# PHONE # │ common_util.py -> setup() # │ __init__.py # │ # ├─Fax # │ G3.py -> bar() # │ __init__.py # │ # ├─Mobile # │ Analog.py -> foo() # │ Digital.py # │ __init__.py # │ # ├─Pager # │ Page.py # │ __init__.py # │ # └─Voice # Isdn.py # __init__.py # from .Analog import foo # ValueError: Attempted relative import in non-package from ..common_util import setup # ValueError: Attempted relative import in non-package from ..Fax.G3 import bar # ValueError: Attempted relative import in non-package if __name__ == '__main__': foo() setup() bar()
如果上述程式碼直接執行,將導致 ValueError 異常,
ValueError: Attempted relative import in non-package
這是因為:一個模組直接執行,Python 認為這個模組就是頂層模組,不存在層次結構,所以找不到其它的相對路徑。
而要正確執行,就要顯式的指定路徑,如下,
C:workspaceX_python>python -m Phone.Mobile.Digital This is foo() from Phone.Mobile.Analog This is setup() from Phone.common_util This is bar() from Phone.Fax.G3
相關教程推薦:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1747/viewspace-2836685/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前置 python 指令碼:requests 無法請求,報錯請問是什麼原因Python指令碼
- 3389管理器是什麼,怎麼管理?開了3389無法登入原因和解決辦法
- 電腦無法識別隨身碟是什麼原因,怎麼解決?
- Python中什麼是閉包?閉包的好處是什麼?Python
- python exit出錯是什麼原因Python
- Python語言無處不在,是什麼原因讓它如此火?Python
- python是什麼?python熱門的原因!Python
- ssl證書無效的原因是什麼?
- Python為什麼會這麼火呢?原因是什麼?Python
- 人工智慧為什麼用Python?原因是什麼?人工智慧Python
- windows10無法關機什麼原因_windows10無法關機怎麼辦Windows
- Linux系統中無法ping的原因是什麼?如何檢視?Linux
- python包匯入細節Python
- Golang-import匯入包語法GolangImport
- FastDFS依賴無法匯入AST
- [重慶思莊每日技術分享]-資料泵匯出資料包39006是什麼原因
- win10底部工作列無響應是什麼原因Win10
- Python包的匯入說明Python
- Golang- import 匯入包的語法GolangImport
- 印表機列印不出來是什麼原因 印表機無法列印解決方法介紹
- 資料泵無法匯入JOB
- vercel無法匯入github專案Github
- Python是什麼?Python成為熱門語言的原因!Python
- 電腦無法連線到這個網路是什麼原因 電腦無法連線到這個網路怎麼解決
- python匯入數字開頭的包的解決辦法Python
- Python 函式預設返回None原因是什麼?Python函式None
- Python真的適合初學者嗎?原因是什麼?Python
- Python匯入包的注意事項Python
- Python匯入包報錯(沒有這個包)Python
- [JS]什麼是閉包?JS
- 什麼是閉包陷阱?
- mysql啟動不了是什麼原因MySql
- HTTP速度慢是什麼原因?HTTP
- 開源版禪道無法匯入缺陷怎麼辦呢?
- Python程式閃退的原因是什麼?如何解決?Python
- 什麼是Godaddy?站長使用它的原因是什麼Go
- 什麼是去中心化錢包?去中心化錢包是什麼意思?中心化
- 什麼程式碼是ChatGPT無法編寫的? - datachimpChatGPT