1. 程式人生 > >python中如何正確使用import

python中如何正確使用import

python中的模組、包、庫

模組:

就是.py檔案,裡面定義了一些函式和變數,需要的時候就可以匯入這些模組

包:

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

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

常見的包結構:

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

庫:

具有相關功能模組的集合。
這也是Python的一大特色之一,即具有強大的標準庫、第三方庫以及自定義模組。
  • 標準庫:就是下載安裝的python裡那些自帶的模組,要注意的是,裡面有一些模組是看不到的比如像sys模組,這與linux下的cd命令看不到是一樣的情況

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

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

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

Python中的import

當一個目錄下有_init_.py檔案時,該目錄就是一個python的包

直接import安裝的包

import Module
import Module as xx

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

from Module import Name
from Module import xx as hostname
from Module import *

import包和import單個檔案是一樣的,我們可以這樣類比:

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

假設有如下目錄結構
pkg
├── init.py
└── file.py

其中init.py內容如下

argument = 0
class A:pass

在和pkg同級目錄下執行如下語句都是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,因為當我們執行import A.B,A和B都必須是模組(檔案或包)

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

Python引用當前庫中的模組關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。
下面將具體介紹幾種常用情況:
(1)主程式與模組程式在同一目錄下:
如下面程式結構:

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

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

(2)主程式所在目錄是模組所在目錄的父(或祖輩)目錄
如下面程式結構:
-- src
|-- mod1.py
|-- mod2
|
– mod2.py
`– test1.py
若在程式test1.py中匯入模組mod2, 需要在mod2資料夾中建立空檔案_init_.py檔案(也可以在該檔案中自定義輸出模組介面); 然後使用 from mod2.mod2 import * 或import mod2.mod2.

(3)主程式匯入上層目錄中模組或其他目錄(平級)下的模組
如下面程式結構:
-- 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

(4)從(3)可以看出,匯入模組關鍵是能夠根據sys.path環境變數的值,找到具體模組的路徑。這裡僅介紹上面三種簡單情況。

相對匯入和絕對匯入

絕對匯入的格式為import A.B或from A import B
相對匯入格式為from . import B或from ..A import B
.代表當前模組,..代表上層模組,…代表上上層模組,依次類推。當我們有多個包時,就可能有需求從一個包import另一個包的內容,這就會產生絕對匯入,而這也往往是最容易發生錯誤的時候

匯入模組時的一些規則

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

基本上遵循這樣的原則

如果是絕對匯入,一個模組只能匯入自身的子模組或和它的頂層模組同級別的模組及其子模組
如果是相對匯入,一個模組必須有包結構且只能匯入它的頂層模組內部的模組