python實(shí)現(xiàn)同級(jí)目錄調(diào)用的示例詳解
前言
通過(guò)制作簡(jiǎn)易的Demo,讓其更加深入的了解如何使用
1. 問(wèn)題所示
發(fā)現(xiàn)python的同級(jí)目錄相互調(diào)用會(huì)出Bug
E:\software\anaconda3\envs\py3.10\python.exe F:\python_project\test\Father\child\file3.py Traceback (most recent call last): File "F:\python_project\test\Father\child\file3.py", line 1, in <module> from ..file1 import greet # 這將失敗,沒有 __init__.py ImportError: attempted relative import with no known parent package Process finished with exit code 1
截圖如下:
2. 原理分析
出現(xiàn) ImportError: attempted relative import with no known parent package 錯(cuò)誤的原因是 Python 無(wú)法識(shí)別當(dāng)前腳本的父包,因此相對(duì)導(dǎo)入失敗
要解決這個(gè)問(wèn)題并理解其背后的原理,需要了解以下幾點(diǎn):
原理分析
相對(duì)導(dǎo)入的限制:
相對(duì)導(dǎo)入(例如,from …module import something)只能在包(包含 __init__.py
文件的目錄)中使用
當(dāng)運(yùn)行腳本時(shí),如果它所在的包沒有正確識(shí)別,Python無(wú)法解析相對(duì)導(dǎo)入
腳本直接運(yùn)行的問(wèn)題:
如果直接運(yùn)行一個(gè)腳本(例如,通過(guò) python file3.py),該腳本的包上下文不會(huì)被識(shí)別
相對(duì)導(dǎo)入會(huì)失敗,因?yàn)镻ython不知道如何定位腳本的父包
3. 解決方法
先給一個(gè)Demo
其文件結(jié)構(gòu)如下:
test/ ├── Father/ │ ├── file1.py │ └── child/ │ └── file3.py
file1如下:
def greet(): print("Hello from file1")
file3如下:
from ..file1 import greet # 這將失敗,沒有 __init__.py def main(): greet() if __name__ == "__main__": main()
這將執(zhí)行出錯(cuò)
通用的解決方式有如下:
3.1 添加父目錄
在file3中修改代碼為如下:
import sys import os # 將父目錄添加到 sys.path sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from Father.file1 import greet def main(): greet() if __name__ == "__main__": main()
執(zhí)行的結(jié)果如下:
3.2 相對(duì)路徑
修改file3如下:
from ..file1 import greet def main(): greet() if __name__ == "__main__": main()
但是 執(zhí)行結(jié)果如下:
需要使用命令行的方式來(lái)執(zhí)行:
注意差異
如果file3的文件如下:
from Father.file1 import greet def main(): greet() if __name__ == "__main__": main()
還是可以直接運(yùn)行的:
3.3 添加init
截圖如下:
對(duì)應(yīng)file3的文件如下:
from Father.file1 import greet def main(): greet() if __name__ == "__main__": main()
截圖如下:
也可使用命令行的方式來(lái)執(zhí)行:
__init__.py
文件在 Python 3.3 及其之后的版本中不是必須的,但它有助于將目錄標(biāo)識(shí)為一個(gè)包
到此這篇關(guān)于python實(shí)現(xiàn)同級(jí)目錄調(diào)用的示例詳解的文章就介紹到這了,更多相關(guān)python同級(jí)目錄調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)教程之while循環(huán)用法講解
Python中除了for循環(huán)之外還有一個(gè)while循環(huán),下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之while循環(huán)用法講解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12pandas參數(shù)設(shè)置的實(shí)用小技巧
這篇文章主要給大家介紹了關(guān)于pandas參數(shù)設(shè)置的實(shí)用小技巧,文中通過(guò)實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python圖像識(shí)別+KNN求解數(shù)獨(dú)的實(shí)現(xiàn)
這篇文章主要介紹了Python圖像識(shí)別+KNN求解數(shù)獨(dú)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python獲取當(dāng)前腳本文件夾(Script)的絕對(duì)路徑方法代碼
在本篇文章中小編給各位整理了關(guān)于Python獲取當(dāng)前腳本文件夾(Script)的絕對(duì)路徑實(shí)例代碼內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-08-08Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對(duì)xml文件的讀取、解析以及Excel文件的寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09用map函數(shù)來(lái)完成Python并行任務(wù)的簡(jiǎn)單示例
這篇文章主要介紹了用map函數(shù)來(lái)完成Python并行任務(wù)的簡(jiǎn)單示例,多線程和多進(jìn)程編程的問(wèn)題一直都是Python中的熱點(diǎn)和難點(diǎn),需要的朋友可以參考下2015-04-04