最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python相對(duì)包導(dǎo)入報(bào)“Attempted?relative?import?in?non-package”錯(cuò)誤問(wèn)題解決

 更新時(shí)間:2023年02月27日 14:58:36   作者:小舔哥  
這篇文章主要介紹了python相對(duì)包導(dǎo)入報(bào)“Attempted?relative?import?in?non-package”錯(cuò)誤,本文要在原理上解決?python當(dāng)中相對(duì)包導(dǎo)入出現(xiàn)的問(wèn)題,需要的朋友可以參考下

文章是從stackoverflow翻譯過(guò)來(lái)的,原文地址:Relative imports for the billionth time

本文要在原理上解決 python當(dāng)中相對(duì)包導(dǎo)入出現(xiàn)的問(wèn)題。

問(wèn)題描述

在win7、32位的電腦上,運(yùn)行python2.7.3,經(jīng)常會(huì)出現(xiàn)"Attempted relative import in non-package"這樣的問(wèn)題。

為了解決這個(gè)問(wèn)題,我(提問(wèn)的人)搜索了以下網(wǎng)站,當(dāng)然還有更多的網(wǎng)站

我根據(jù)pep-0328建立了以下的目錄結(jié)構(gòu)

package/

    __init__.py

        subpackage1/

            __init__.py

            moduleX.py

            moduleY.py

        subpackage2/

            __init__.py

            moduleZ.py

        moduleA.py

而且按照這個(gè)目錄當(dāng)中的要求,建立了了spam(moduleY.py中)和eggs(moduleZ.py中)函數(shù),現(xiàn)在想要在moduleX.py當(dāng)中調(diào)用別的函數(shù)或模塊。很顯然,當(dāng)我運(yùn)行的時(shí)候,并沒(méi)有成功。

上面的第四個(gè)URL當(dāng)中有如下信息,這個(gè)答案比較接近真相,但是其中的有些概念還是很難理解:

相對(duì)導(dǎo)入使用模塊的名稱屬性來(lái)決定模塊在包層次結(jié)構(gòu)中的位置,如果模塊的名稱不包含任何包信息(例如:被設(shè)置成‘main’),那么相對(duì)導(dǎo)入則被解析為最頂層的位置,不管這個(gè)時(shí)候這個(gè)模塊實(shí)際上位于文件系統(tǒng)中的什么位置。

所以,如何讓我運(yùn)行的python程序不再返回"Attempted relative import in non-package"問(wèn)題?python為什么會(huì)報(bào)這個(gè)錯(cuò)誤?這里的‘non-package’是什么意思?為什么以及如何去定義一個(gè)‘package’?同時(shí)解釋一下-m選項(xiàng)?

回答:

什么是腳本?什么是模塊?(script vs module)

直接運(yùn)行一個(gè)文件和在別的文件中導(dǎo)入這個(gè)文件是有很大區(qū)別的,僅僅知道一個(gè)文件在目錄中的位置并不意味著python程序就認(rèn)為它在什么位置。這是由python用何種方式加載(運(yùn)行或者導(dǎo)入.run or import)這個(gè)文件來(lái)決定的。

python有兩種加載文件的方法:一種是作為頂層的腳本,另一種是當(dāng)做模塊。如果你直接執(zhí)行這個(gè)程序,那么這個(gè)文件就被當(dāng)做是頂層腳本來(lái)執(zhí)行了,在命令行里面輸入 python myfile.py 就是這個(gè)情況。如果你輸入python -m myfile.py或者在其他的文件當(dāng)中使用import來(lái)導(dǎo)入這個(gè)文件的時(shí)候,它就被當(dāng)做模塊來(lái)導(dǎo)入。在同一時(shí)間里,只有一個(gè)頂層腳本,頂層腳本可以這樣解釋:它是一個(gè)能夠讓你的程序從這里開(kāi)始的python文件。

【文件(file)是一種無(wú)區(qū)別的叫法,如何運(yùn)行和處理這個(gè)文件,決定了它的性質(zhì)。直接從這個(gè)文件運(yùn)行,那么這個(gè)文件就叫做腳本。導(dǎo)入這個(gè)文件,那么這個(gè)文件就是模塊(module)。另外,一個(gè)包(package)是一個(gè)包含有__init__.py的文件夾,下面會(huì)用到】

命名(naming)

當(dāng)一個(gè)文件被加載進(jìn)來(lái),它就有一個(gè)名稱(這個(gè)名稱存儲(chǔ)在__name__屬性當(dāng)中)。如果這個(gè)文件被當(dāng)做一個(gè)頂層腳本來(lái)進(jìn)行加載,那么它的名字就是__main__。如果它被當(dāng)做一個(gè)模塊加載,那么它的名稱就是文件名稱,加上它所在的包名,以及所有的頂層的包名,這些名稱中間是用點(diǎn)號(hào)隔開(kāi)的。

比如下面的例子

package/

    __init__.py

    subpackage1/

        __init__.py

        moduleX.py
    moduleA.py

比如你導(dǎo)入moduleX(from package.subpackag1 import moduleX),它的名稱就package.subpackage1.mouleX。如果你導(dǎo)入moduleA的時(shí)候(from package import moduleA),它的名稱就是package.moudleA。

(注:這里是使用包導(dǎo)入,即把package以及里面的所有文件看做一個(gè)包,導(dǎo)入的時(shí)候使用from ... import ...的形式來(lái)進(jìn)行,我們調(diào)用第三方包的時(shí)候就是這種情況),

但是,當(dāng)你直接從命令行里面運(yùn)行moduleX的時(shí)候,他的名稱則被替換為_(kāi)_main__。如果你直接從命令行運(yùn)行moduleA,它的名稱也是__main__。當(dāng)一個(gè)模塊被當(dāng)做一個(gè)頂層腳本來(lái)執(zhí)行的時(shí)候,它原來(lái)的名稱則會(huì)被__main__取代。

不通過(guò)包導(dǎo)入訪問(wèn)一個(gè)模塊

這里有一個(gè)額外的問(wèn)題:模塊的名稱取決于從它所在的目錄中直接導(dǎo)入的,還是通過(guò)包導(dǎo)入的。這種情況只有在該包中運(yùn)行python文件,并且試圖導(dǎo)入這個(gè)包當(dāng)中的其它文件的時(shí)候才有意義。(可以發(fā)現(xiàn),上面的介紹的包導(dǎo)入總是在外面來(lái)訪問(wèn)一個(gè)模塊)

舉個(gè)例子,如果你在package/subpackage1目錄當(dāng)中打開(kāi)python解釋器,然后輸入import moduleX,那么moduleX的名稱就是moduleX,而不是package.subpackage1.moduleX。這是因?yàn)閜ython把當(dāng)前的目錄添加到了搜索路徑上面。如果它發(fā)現(xiàn)被包含的模塊在當(dāng)前的目錄當(dāng)中,它將不知道該目錄也是模塊的一部分,包的信息不會(huì)出現(xiàn)在模塊名稱當(dāng)中。

當(dāng)你直接運(yùn)行python解釋器(比如cmd里面輸入python,然后進(jìn)入python解釋器,或者使用ipython)。在這種情況下,這種交互式的終端的名稱是__main__。

現(xiàn)在,你的問(wèn)題有了一個(gè)關(guān)鍵性的答案:如果一個(gè)模塊名稱當(dāng)中沒(méi)有點(diǎn)號(hào),那么它就不會(huì)被當(dāng)做是一個(gè)包。不管這個(gè)文件在磁盤的什么位置。所有關(guān)鍵在于,它的名稱是什么,而這個(gè)名稱取決于你如何加載它。

那么現(xiàn)在看一下你在其他的URL當(dāng)中的引用的這句話:

相對(duì)導(dǎo)入使用模塊的名稱屬性來(lái)決定模塊在包層次結(jié)構(gòu)中的位置,如果模塊的名稱不包含任何包信息(例如:被設(shè)置成‘main’),那么相對(duì)導(dǎo)入則被解析為最頂層的位置,不管這個(gè)時(shí)候這個(gè)模塊實(shí)際上位于文件系統(tǒng)中的什么位置。

相對(duì)導(dǎo)入...

相對(duì)導(dǎo)入使用模塊的名稱去決定它在一個(gè)包中的位置。當(dāng)你使用了一個(gè)像這樣的相對(duì)導(dǎo)入:from .. import foo,這里的點(diǎn)號(hào)表明在包的層次結(jié)構(gòu)當(dāng)中上升幾個(gè)層級(jí)。比如,現(xiàn)在模塊的名稱是package.subpackage1.moudleX,然后..moduleA中的兩個(gè)點(diǎn)號(hào)表示的是上升兩個(gè)層級(jí),到達(dá)package,然后package和moduleA結(jié)合,最終成為package.moduleA。要讓from .. import這樣的相對(duì)導(dǎo)入正常工作,模塊的名稱中至少要有和語(yǔ)句中相對(duì)應(yīng)的“點(diǎn)”的數(shù)量。

...只能用在相對(duì)導(dǎo)入當(dāng)使用

如果你的模塊的名稱是__main__,那么它就不被認(rèn)為是在一個(gè)包當(dāng)中,因?yàn)樗拿Q當(dāng)中不含有“點(diǎn)”,所以你不能在它的里面使用from .. import。如果你使用了這個(gè)語(yǔ)句,那么程序就會(huì)報(bào)“relative-import in non-package"錯(cuò)誤。

腳本不能包含相對(duì)導(dǎo)入:

當(dāng)你直接運(yùn)行moduleX或者是在命令行終端里運(yùn)行程序的時(shí)候,這個(gè)時(shí)候模塊的名稱都是__main__,這就表明你不能使用相對(duì)導(dǎo)入。因?yàn)樗麄兊拿Q表示他們并不在一個(gè)包當(dāng)中。注:當(dāng)你運(yùn)行的python目錄就是你模塊所在的目錄的時(shí)候,上面這種情況也會(huì)發(fā)生,這種情況下python過(guò)早的尋找當(dāng)前目錄的模塊,并沒(méi)有認(rèn)為他們也是包的一部分。

當(dāng)你運(yùn)行交互式的解釋器的時(shí)候,交互式進(jìn)程的名稱永遠(yuǎn)是__main__,因此你不能在交互式進(jìn)程當(dāng)中使用相對(duì)導(dǎo)入。相對(duì)導(dǎo)入只能在模塊文件當(dāng)中使用。

兩個(gè)解決方法:

1:如果你想直接運(yùn)行moduleX,但是你又想把它當(dāng)做一個(gè)包的一部分,你可以使用python -m package.subpackage.moduleX. -m參數(shù)告訴python把它當(dāng)做一個(gè)模塊來(lái)加載,而不是頂層的腳本。

2:或許你并不想直接運(yùn)行moduleX,你想在其它的腳本當(dāng)中使用moduleX的函數(shù),比如說(shuō)這個(gè)腳本是myfile.py。如果是這種情況,需要把myfile.py放在別的地方,而不是在package目錄里面。在myfile.py使用一下語(yǔ)句就可以正常工作了:from package.moduleA import spam.

注:對(duì)于上面說(shuō)的這兩種情況,包目錄(比如上面的package)必須存在于python的搜索路徑下面(sys.path)。如果不存在,你將不能夠使用包中的任何東西。

自從python2.6,模塊的名稱不在決定使用__name__屬性,而是使用__packege__屬性。這就是為什么我避免使用__name__這么明確的名稱來(lái)代表一個(gè)模塊的名稱。自從python2.6,一個(gè)模塊的名稱是由__package__+'.'+__name__來(lái)確定的,如果__packege__是None的話,那么這個(gè)名稱就是__name__了。

到此這篇關(guān)于python相對(duì)包導(dǎo)入報(bào)“Attempted relative import in non-package”錯(cuò)誤的文章就介紹到這了,更多相關(guān)python相對(duì)包導(dǎo)入報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django中在xadmin中集成DjangoUeditor過(guò)程詳解

    Django中在xadmin中集成DjangoUeditor過(guò)程詳解

    這篇文章主要介紹了Django中在xadmin中集成DjangoUeditor過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python換行與不換行的輸出實(shí)例

    Python換行與不換行的輸出實(shí)例

    這篇文章主要介紹了Python換行與不換行的輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)

    pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)

    這篇文章主要介紹了pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理),pandas對(duì)大數(shù)據(jù)有很多便捷的清洗用法,尤其針對(duì)缺失值和重復(fù)值,詳細(xì)介紹感興趣的小伙伴可以參考下面文章內(nèi)容
    2022-08-08
  • Python實(shí)現(xiàn)動(dòng)態(tài)二維碼生成的示例代碼

    Python實(shí)現(xiàn)動(dòng)態(tài)二維碼生成的示例代碼

    這篇文章主要和大家分享兩個(gè)制作二維碼的Python庫(kù),可以生成普通的二維碼、圖片背景版二維碼、動(dòng)圖GIF版二維。文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Python理解遞歸的方法總結(jié)

    Python理解遞歸的方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于如何使用Python來(lái)理解遞歸的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-01-01
  • Python中BeautifulSoup模塊詳解

    Python中BeautifulSoup模塊詳解

    大家好,本篇文章主要講的是Python中BeautifulSoup模塊詳解,感興趣的同學(xué)趕緊來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • PyQt5高級(jí)界面控件之QTableWidget的具體使用方法

    PyQt5高級(jí)界面控件之QTableWidget的具體使用方法

    這篇文章主要介紹了PyQt5高級(jí)界面控件之QTableWidget的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    這篇文章主要介紹了Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python腳本請(qǐng)求數(shù)量達(dá)到上限,http請(qǐng)求重試問(wèn)題

    python腳本請(qǐng)求數(shù)量達(dá)到上限,http請(qǐng)求重試問(wèn)題

    這篇文章主要介紹了python腳本請(qǐng)求數(shù)量達(dá)到上限,http請(qǐng)求重試問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • python 實(shí)現(xiàn)調(diào)用子文件下的模塊方法

    python 實(shí)現(xiàn)調(diào)用子文件下的模塊方法

    今天小編就為大家分享一篇python 實(shí)現(xiàn)調(diào)用子文件下的模塊方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12

最新評(píng)論

南靖县| 逊克县| 西安市| 大同市| 潮州市| 荃湾区| 绥滨县| 乾安县| 吉水县| 辽宁省| 江口县| 南召县| 灵寿县| 日喀则市| 清徐县| 法库县| 千阳县| 巴彦淖尔市| 长寿区| 奎屯市| 林甸县| 平阳县| 吉木乃县| 尉氏县| 舟曲县| 庄河市| 永嘉县| 泗水县| 嵊泗县| 金寨县| 淮阳县| 阳东县| 会泽县| 尉犁县| 铜陵市| 襄城县| 四平市| 轮台县| 桂林市| 锡林浩特市| 吴忠市|