python中的模塊、包、庫模塊:就是.py文件,里面定義了一些函數(shù)和變量,需要的時候就可以導入這些模塊 包:在模塊之上的概念,為了方便管理而將文件進行打包。
一個文件夾下必須要有_init_.py這個文件才會被識別為包。 包目錄下第一個文件便是 init.py,然后是一些模塊文件和子目錄 假如子目錄中也有 init.py,那么它就是這個包的子包了 常見的包結(jié)構(gòu): package_a
├── __init__.py├── module_a1.py└── module_a2.py 庫:具有相關(guān)功能模塊的集合。
這也是Python的一大特色之一,即具有強大的標準庫、第三方庫以及自定義模塊。
另外:模塊、包、庫這三個概念實際上都是模塊,只不過是個體和集合的區(qū)別
Python中的import當一個目錄下有_init_.py文件時,該目錄就是一個python的包 直接import安裝的包import Moduleimport Module as xx 從包import對象(下級模塊,類,函數(shù),變量等)from Module import Namefrom Module import xx as hostnamefrom Module import *
import包和import單個文件是一樣的,我們可以這樣類比: import單個文件時,文件里的類,函數(shù),變量都可以作為import的對象 import包時,包里的子包,文件,以及_init_.py里的類,函數(shù),變量都可以作為import的對象 假設(shè)有如下目錄結(jié)構(gòu) pkg ├── init.py └── file.py 其中init.py內(nèi)容如下 在和pkg同級目錄下執(zhí)行如下語句都是OK的 import pkg import pkg.file from pkg import file from pkg import A from pkg import argument
但如下語句是錯誤的 import pkg.A import pkg.argument 報錯ImportError: No module named xxx,因為當我們執(zhí)行import A.B,A和B都必須是模塊(文件或包) 引用主程序所在庫中的模塊Python引用當前庫中的模塊關(guān)鍵是能夠在sys.path里面找到通向模塊文件的路徑。 下面將具體介紹幾種常用情況: (1)主程序與模塊程序在同一目錄下: 如下面程序結(jié)構(gòu): – src |– mod1.py `– test1.py 若在程序test1.py中導入模塊mod1, 則直接使用import mod1或from mod1 import *; (2)主程序所在目錄是模塊所在目錄的父(或祖輩)目錄 如下面程序結(jié)構(gòu):
-- src |-- mod1.py |-- mod2 | – mod2.py `– test1.py 若在程序test1.py中導入模塊mod2, 需要在mod2文件夾中建立空文件_init_.py文件(也可以在該文件中自定義輸出模塊接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2. (3)主程序?qū)肷蠈幽夸浿心K或其他目錄(平級)下的模塊 如下面程序結(jié)構(gòu):
-- src |-- mod1.py |-- mod2 | – mod2.py |– sub | -- test2.py
– test1.py 若在程序test2.py中導入模塊mod1和mod2。首先需要在mod2下建立init.py文件(同(2)),src下不必建立該文件。然后調(diào)用方式如下:
下面程序執(zhí)行方式均在程序文件所在目錄下執(zhí)行,如test2.py是在cd sub;之后執(zhí)行Python test2.py 而test1.py是在cd src;之后執(zhí)行python test1.py; 不保證在src目錄下執(zhí)行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2 (4)從(3)可以看出,導入模塊關(guān)鍵是能夠根據(jù)sys.path環(huán)境變量的值,找到具體模塊的路徑。這里僅介紹上面三種簡單情況。 相對導入和絕對導入絕對導入的格式為import A.B或from A import B 相對導入格式為from . import B或from ..A import B .代表當前模塊,..代表上層模塊,…代表上上層模塊,依次類推。當我們有多個包時,就可能有需求從一個包import另一個包的內(nèi)容,這就會產(chǎn)生絕對導入,而這也往往是最容易發(fā)生錯誤的時候 導入模塊時的一些規(guī)則在沒有明確指定包結(jié)構(gòu)的情況下,python是根據(jù)name來決定一個模塊在包中的結(jié)構(gòu)的,如果是main則它本身是頂層模塊,沒有包結(jié)構(gòu),如果是A.B.C結(jié)構(gòu),那么頂層模塊是A。 基本上遵循這樣的原則如果是絕對導入,一個模塊只能導入自身的子模塊或和它的頂層模塊同級別的模塊及其子模塊 如果是相對導入,一個模塊必須有包結(jié)構(gòu)且只能導入它的頂層模塊內(nèi)部的模塊
|