日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pythonpackage详解_Python详解之包管理:__init__.py

發(fā)布時間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonpackage详解_Python详解之包管理:__init__.py 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py文件,在另一個文件中需要import時,將事先寫好的.py文件拷貝到當前目錄,或者是在sys.path中增加事先寫好的.py文件所在的目錄,然后import。這樣的做法,對于少數(shù)文件是可行的,但如果程序數(shù)目很多,層級很復(fù)雜,就很吃力了。

有沒有辦法,像Java的Package一樣,將多個.py文件組織起來,以便在外部統(tǒng)一調(diào)用,和在內(nèi)部互相調(diào)用呢?答案是有的。主要是用到python的包的概念,__init__.py在包里起一個比較重要的作用。

要弄明白這個問題,首先要知道,python在執(zhí)行import語句時,到底進行了什么操作,按照python的文檔,它執(zhí)行了如下操作:

第1步,創(chuàng)建一個新的,空的module對象(它可能包含多個module);

第2步,把這個module對象插入sys.module中;

第3步,裝載module的代碼(如果需要,首先必須編譯);

第4步,執(zhí)行新的module中對應(yīng)的代碼。

在執(zhí)行第3步時,首先要找到module程序所在的位置,其原理為:如果需要導(dǎo)入的module的名字是m1,則解釋器必須找到m1.py,它首先在當前目錄查找,然后是在環(huán)境變量PYTHONPATH中查找。 PYTHONPATH可以視為系統(tǒng)的PATH變量一類的東西,其中包含若干個目錄。如果PYTHONPATH沒有設(shè)定,或者找不到m1.py,則繼續(xù)搜索 與python的安裝設(shè)置相關(guān)的默認路徑,在Unix下,通常是/usr/local/lib/python。

事實上,搜索的順序是:當前路徑 (以及從當前目錄指定的sys.path),然后是PYTHONPATH,然后是python的安裝設(shè)置相關(guān)的默認路徑。正因為存在這樣的順序,如果當前 路徑或PYTHONPATH中存在與標準module同樣的module,則會覆蓋標準module。也就是說,如果當前目錄下存在xml.py,那么執(zhí) 行import xml時,導(dǎo)入的是當前目錄下的module,而不是系統(tǒng)標準的xml。

了解了這些,我們就可以先構(gòu)建一個package,以普通module的方式導(dǎo)入,就可以直接訪問此package中的各個module了。Python中的package定義很簡單,其層次結(jié)構(gòu)與程序所在目錄的層次結(jié)構(gòu)相同,這一點與Java類似,唯一不同的地方在于,python中的package必須包含一個__init__.py 的文件。

例如,我們可以這樣組織一個package:package1/

__init__.py

subPack1/

__init__.py

module_11.py

module_12.py

module_13.py

subPack2/

__init__.py

module_21.py

module_22.py

……

__init__.py可以為空,只要它存在,就表明此目錄應(yīng)被作為一個package處理。當然,__init__.py中也可以設(shè)置相應(yīng)的內(nèi)容,下文詳細介紹。

好了,現(xiàn)在我們在module_11.py中定義一個函數(shù):

def funA():

print "funcA in module_11"

return

在頂層目錄(也就是package1所在的目錄,當然也參考上面的介紹,將package1放在解釋器能夠搜索到的地方)運行python:

>>>from package1.subPack1.module_11 import funcA

>>>funcA()

funcA in module_11這樣,我們就按照package的層次關(guān)系,正確調(diào)用了module_11中的函數(shù)。

細心的用戶會發(fā)現(xiàn),有時在import語句中會出現(xiàn)通配符*,導(dǎo)入某個module中的所有元素,這是怎么實現(xiàn)的呢?答案就在__init__.py中。我們在subPack1的__init__.py文件中寫:

__all__ = ['module_13', 'module_12']然后進入python

>>>from package1.subPack1 import *

>>>module_11.funcA()

Traceback (most recent call last):

File "", line 1, in

ImportError: No module named module_11也就是說,以*導(dǎo)入時,package內(nèi)的module是受__init__.py限制的。

好了,最后來看看,如何在package內(nèi)部互相調(diào)用。如果希望調(diào)用同一個package中的module,則直接import即可。也就是說,在module_12.py中,可以直接使用

import module_11如果不在同一個package中,例如我們希望在module_21.py中調(diào)用module_11.py中的FuncA,則應(yīng)該這樣:

from module_11包名.module_11 import funcA

總結(jié)

以上是生活随笔為你收集整理的pythonpackage详解_Python详解之包管理:__init__.py的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。