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 # 這將失敗,沒(méi)有 __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í),如果它所在的包沒(méi)有正確識(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 # 這將失敗,沒(méi)有 __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)文章
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法詳解
這篇文章主要介紹了VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法,較為詳細(xì)的分析了VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的具體步驟、相關(guān)命令與操作注意事項(xiàng),需要的朋友可以參考下2019-07-07
Linux下將Python的Django項(xiàng)目部署到Apache服務(wù)器
這篇文章主要介紹了Python的Django項(xiàng)目部署到Apache服務(wù)器上的要點(diǎn)總結(jié),文中針對(duì)的是wsgi連接方式,需要的朋友可以參考下2015-12-12
python3操作mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了python3操作mysql數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Python參數(shù)解析器configparser簡(jiǎn)介
configparser是python自帶的配置參數(shù)解析器,可以用于解析.config文件中的配置參數(shù),ini文件中由sections(節(jié)點(diǎn))-key-value組成,這篇文章主要介紹了Python參數(shù)解析器configparser,需要的朋友可以參考下2022-12-12
python實(shí)現(xiàn)提取str字符串/json中多級(jí)目錄下的某個(gè)值
今天小編就為大家分享一篇python實(shí)現(xiàn)提取str字符串/json中多級(jí)目錄下的某個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
在Django中創(chuàng)建第一個(gè)靜態(tài)視圖
這篇文章主要介紹了在Django中創(chuàng)建第一個(gè)靜態(tài)視圖的方法,與其他編程語(yǔ)言的開(kāi)始一樣,以Hello world作為示例,需要的朋友可以參考下2015-07-07
Python和Pygame庫(kù)開(kāi)發(fā)“小黃狗跑酷”游戲
“小黃狗跑酷”是一款有趣的跑酷類游戲,玩家將控制一只可愛(ài)的小黃狗在城市的街道上跑酷,避開(kāi)障礙物,收集骨頭,盡可能獲得高分,本文將全面介紹如何使用Python和Pygame庫(kù)來(lái)開(kāi)發(fā)這個(gè)游戲,從最初的概念設(shè)計(jì)到最終的代碼實(shí)現(xiàn),幫助您理解游戲開(kāi)發(fā)的基本流程2025-03-03
使用Python實(shí)現(xiàn)屏幕截圖功能的詳細(xì)教程
Python使用ImageGrab截圖主要依賴于Pillow庫(kù)(PIL庫(kù)的一個(gè)分支),該庫(kù)提供了ImageGrab模塊來(lái)實(shí)現(xiàn)屏幕截圖功能,以下是一個(gè)詳細(xì)的截圖教程,需要的朋友可以參考下2025-01-01

