創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的姑蘇網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!小編給大家分享一下python為什么使用import報錯,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在練習Python中package的相對導入時,即
from . import XXX
或者
from .. import XXX
有時會遇到這樣兩個錯誤:
SystemError: Parent module '' not loaded, cannot perform relative import
和
ValueError: attempted relative import beyond top-level package
其實這兩個錯誤的原因歸根結(jié)底是一樣的:在涉及到相對導入時,package所對應(yīng)的文件夾必須正確的被python解釋器視作package,而不是普通文件夾。否則由于不被視作package,無法利用package之間的嵌套關(guān)系實現(xiàn)python中包的相對導入。
文件夾被python解釋器視作package需要滿足兩個條件:
1、文件夾中必須有__init__.py文件,該文件可以為空,但必須存在該文件。
2、不能作為頂層模塊來執(zhí)行該文件夾中的py文件(即不能作為主函數(shù)的入口)。
補充:在"from YY import XX"這樣的代碼中,無論是XX還是YY,只要被python解釋器視作package,就會首先調(diào)用該package的__init__.py文件。如果都是package,則調(diào)用順序是YY,XX。
另外,練習中“from . import XXX”和“from .. import XXX”中的'.'和'..',可以等同于linux里的shell中'.'和'..'的作用,表示當前工作目錄的package和上一級的package。
舉個例子:
目錄樹
testIm/ --__init__.py --main.py : from Tom import tom --Tom/ --__init__.py : print("I'm Tom's __init__!") --tom.py : from . import tomBrother, from .. import kate,print("I'm Tom!") --tomBrother.py print(I'm Tom's Brother!) --Kate/ --__init__.py : print("I'm Kate's __init__!") --kate.py
運行文件:main.py
結(jié)果
I'm Tom's __init__! I'm Tom's Brother! Traceback (most recent call last): File "D:\PythonLearning\TestIm\main.py", line 3, infrom Tom import tom File "D:\PythonLearning\TestIm\Kate\kate.py", line 4, in from .. import kate ValueError: attempted relative import beyond top-level package>>>
可以看到from . import tomBrother順利執(zhí)行,首先執(zhí)行了Tom文件夾下的__init__.py文件,后來執(zhí)行了tomBrother.py文件,但是當執(zhí)行到“from .. import kate”時報錯,這是因為我們是在TestIm文件夾下把main.py文件作為主函數(shù)的入口執(zhí)行的,因此盡管TestIm文件夾中有__init__.py文件,但是該文件夾不能被python解釋器視作package,即Tom package不存在上層packge,自然會報錯,相對導入時超出了最高層級的package。
修改方法:
目錄樹
test/ --main.py : from testIm.Tom import tom --testIm/ --__init__.py --Tom/ --__init__.py : print("I'm Tom's __init__!") --tom.py : from . import tomBrother, from .. import Kate,print("I'm Tom!") --tomBrother.py print(I'm Tom's Brother!) --Kate/ --__init__.py : print("I'm Kate's __init__!") --kate.py
運行文件:main.py
結(jié)果
I'm top's __init__! I'm Tom's __init__! I'm Tom's Brother!! I'm Kate's __init__! I'm Tom!
即主函數(shù)入口不在TestIm中,則TestIm和其同樣包含__init__.py文件的子文件夾都被python解釋器視作package,形成相應(yīng)的嵌套關(guān)系。可以正常使用from . import XXX和from .. import XXX。
以上是“python為什么使用import報錯”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!