1. 程式人生 > >python3中import模組、包、庫的用法

python3中import模組、包、庫的用法

模組的概念:

就是.py檔案,裡面定義了一些函式和變數,需要的時候就可以匯入這些模組,python中可以匯入自帶的模組,也可以匯入我們自己編寫的模組(即.py檔案)。

包的概念:

在模組之上的概念,為了方便管理而將檔案進行打包。

一個資料夾下必須要有_init_.py這個檔案才會被識別為包。當一個目錄下有_init_.py檔案時,該目錄就是一個python的包。包目錄下第一個檔案便是 init.py,然後是一些模組檔案和子目錄。假如子目錄中也有 init.py,那麼它就是這個包的子包。

對於含有 __init__.py 的資料夾,其實它就是一個包(package),它的子目錄如果也包含 __init__.py,只要通過import將該包載入入sys.path,子目錄就不用再載入,python在import的時候會自動遍歷所有含有 __init__.py 的子目錄。

常見包結構:

package_a
├── __init__.py
├── module_a1.py
└── module_a2.py

庫的概念:

具有相關功能模組的集合。這也是Python的一大特色之一,即具有強大的標準庫、第三方庫以及自定義模組。

標準庫:就是下載安裝的python裡那些自帶的模組,要注意的是,裡面有一些模組是看不到的,比如像sys模組。

第三方庫:就是由其他的第三方機構,釋出的具有特定功能的模組。

自定義模組:使用者自己可以自行編寫模組,然後使用。

注意:

模組、包、庫這三個概念實際上都是模組,只不過是個體和集合的區別。

python檔案的引入方式有2種:

作為頂層執行指令碼(執行入口)而載入;//即直接執行一個.py檔案

作為模組被引入。//使用python -m file.py的方式或import file的方式

python3中使用import的方法有2種: 

直接import安裝的包、庫或模組(自帶或自己寫的):

import單個檔案時,檔案裡的類,函式,變數都可以作為import的物件。import包時,包裡的子包,檔案,以及_init_.py裡的類,函式,變數都可以作為import的物件。

import 包或模組1

//匯入該模組,可使用該包或模組的全部方法,在程式碼中呼叫其方法必須寫成module.function的形式

import 包或模組1 as 包或模組1別名

//匯入該包或模組並給該包或模組取個別名,可使用該包或模組的全部方法,在程式碼中呼叫其方法必須寫成module.function的形式

從包import物件(下級模組,類,函式,變數等):

from Module import Name

///匯入模組Module中的名為name的模組

from Module import xx as hostname

//匯入模組Module中的名為xx的模組,並其一個別名hostname

from Module import *

//可在程式碼中直接使用該模組中的方法名,如:

from math import sqrt是把sqrt作為本檔案的方法匯入進來了,使用的時候只需要直接呼叫sqrt。

而如果import是import math,那麼呼叫的時候要採用math.sqrt的方式。

引用主程式所在庫中的模組:

Python引用當前庫中的模組關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。 

幾種常見情況:

主程式與模組程式在同一目錄下,如:

– – src 
|– mod1.py 
`– test1.py

若在程式test1.py中匯入模組mod1, 則直接使用import mod1或from mod1 import *;

主程式所在目錄是模組所在目錄的父(或祖輩)目錄,如:

– – src
|– mod1.py 
|– – mod2
|– mod2.py 
`– test1.py 

若在程式test1.py中匯入模組mod2, 需要在mod2資料夾中建立空檔案_init_.py檔案(也可以在該檔案中自定義輸出模組介面); 然後使用 from mod2.mod2 import * 或import mod2.mod2.

主程式匯入上層目錄中模組或其他目錄(平級)下的模組,如:
– – src
|– mod1.py 
|– – mod2
|– mod2.py 
 |– sub 
 | – –test2.py 
`– test1.py 
若在程式test2.py中匯入模組mod1和mod2。首先需要在mod2下建立init.py檔案(同(2)),src下不必建立該檔案。然後呼叫方式如下: 
下面程式執行方式均在程式檔案所在目錄下執行,如test2.py是在cd sub;之後執行Python test2.py 
而test1.py是在cd src;之後執行python test1.py; 不保證在src目錄下執行python sub/test2.py成功。 
import sys 
sys.path.append(“..”) 
import mod1 
import mod2.mod2

相對匯入和絕對匯入:

絕對匯入格式:

import A.B或from A import B 

相對匯入格式:

from . import B或from ..A import B 

.代表當前模組,..代表上層模組,…代表上上層模組,依次類推。

在沒有明確指定包結構的情況下,python是根據name來決定一個模組在包中的結構的,如果是main則它本身是頂層模組,沒有包結構,如果是A.B.C結構,那麼頂層模組是A。

如果是絕對匯入,一個模組只能匯入自身的子模組或和它的頂層模組同級別的模組及其子模組 。

如果是相對匯入,一個模組必須有包結構且只能匯入它的頂層模組內部的模組。

模組的搜尋路徑:

當我們試圖載入一個模組時,Python會在指定的路徑下搜尋對應的.py檔案,如果找不到,就會報錯。

如:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mymodule

在預設情況下,Python直譯器會搜尋當前目錄、所有已安裝的內建模組和第三方模組,搜尋路徑存放在sys模組的path變數中

我們可以在python檢視sys.path變數中的路徑:

>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

我們還可以新增自己的搜尋目錄,有兩種方法

一是直接修改sys.path,新增要搜尋的目錄:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

這種方法是在執行時修改,執行結束後失效。

二是設定環境變數PYTHONPATH,該環境變數的內容會被自動新增到模組搜尋路徑中。設定方式與設定Path環境變數類似。注意只需要新增你自己的搜尋路徑,Python自己本身的搜尋路徑不受影響。