python中import的作用_python使用import报错是什么原因
在練習(xí)Python中package的相對(duì)導(dǎo)入時(shí),即from . import XXX
或者from .. import XXX
有時(shí)會(huì)遇到這樣兩個(gè)錯(cuò)誤:SystemError: Parent module '' not loaded, cannot perform relative import
和ValueError: attempted relative import beyond top-level package
其實(shí)這兩個(gè)錯(cuò)誤的原因歸根結(jié)底是一樣的:在涉及到相對(duì)導(dǎo)入時(shí),package所對(duì)應(yīng)的文件夾必須正確的被python解釋器視作package,而不是普通文件夾。否則由于不被視作package,無法利用package之間的嵌套關(guān)系實(shí)現(xiàn)python中包的相對(duì)導(dǎo)入。
文件夾被python解釋器視作package需要滿足兩個(gè)條件:
1、文件夾中必須有__init__.py文件,該文件可以為空,但必須存在該文件。
2、不能作為頂層模塊來執(zhí)行該文件夾中的py文件(即不能作為主函數(shù)的入口)。
補(bǔ)充:在"from YY import XX"這樣的代碼中,無論是XX還是YY,只要被python解釋器視作package,就會(huì)首先調(diào)用該package的__init__.py文件。如果都是package,則調(diào)用順序是YY,XX。
另外,練習(xí)中“from . import XXX”和“from .. import XXX”中的'.'和'..',可以等同于linux里的shell中'.'和'..'的作用,表示當(dāng)前工作目錄的package和上一級(jí)的package。
舉個(gè)例子:
目錄樹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
運(yùn)行文件: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, in from 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文件,但是當(dāng)執(zhí)行到“from .. import kate”時(shí)報(bào)錯(cuò),這是因?yàn)槲覀兪窃赥estIm文件夾下把main.py文件作為主函數(shù)的入口執(zhí)行的,因此盡管TestIm文件夾中有__init__.py文件,但是該文件夾不能被python解釋器視作package,即Tom package不存在上層packge,自然會(huì)報(bào)錯(cuò),相對(duì)導(dǎo)入時(shí)超出了最高層級(jí)的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
運(yùn)行文件: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。
總結(jié)
以上是生活随笔為你收集整理的python中import的作用_python使用import报错是什么原因的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux sed名宁,Linux sh
- 下一篇: 这些天