當前位置:
首頁 > 知識 > Python 標準庫系列之模塊介紹

Python 標準庫系列之模塊介紹

點擊上方「

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!






Python的模塊其實就是封裝了一個或者多個功能的代碼集合,以便於重用,模塊可以是一個文件也可以是一個目錄,目錄的形式稱作包。



模塊分類




內置模塊




內置模塊可以理解成當你安裝好python環境之後,直接可以使用import導入的就是內置模塊,默認模塊路徑為:C:Python35lib,你也可以通過以下方式獲取內置模塊的路徑:





# 導入sys模塊


>>>

import

sys


# 最後一個目錄就是內置模塊的路徑

>>>

for

n

in

sys

.

path

:


...

  

print

(

n

)


...


 


C

:

Python35libsite

-

packagespip

-

8.1.1

-

py3

.

5.egg


C

:

Python35python35

.

zip


C

:

Python35DLLs


C

:

Python35lib


C

:

Python35


C

:

Python35libsite

-

packages




第三方模塊




第三方模塊通常是開發者自己編寫的模塊,然後提交到python官方的庫中,這樣我們就可以下載安裝使用了,默認安裝目錄為C:Python35libsite-packages,




自定義模塊




自己編寫的模塊




模塊的導入方式




把一個模塊當做成一個整體來進行導入





import sys




從一個模塊中導入特定的變數或者是方法





from sys import path




調用的時候直接使用方法名path





>>>

path


[

""

,

"C:Python35libsite-packagespip-8.1.1-py3.5.egg"

,

"C:Python35python35.zip"

,

"C:Python35DLLs"

,

"C:Python35lib"

,

"C:Python35"

,

"C:Python35libsite-packages"

]




給導入的模塊或者方法起一個別名





from sys import path as path_alias




調用的時候使用別名path_alias





>>>

path

_

alias


[

""

,

"C:Python35libsite-packagespip-8.1.1-py3.5.egg"

,

"C:Python35python35.zip"

,

"C:Python35DLLs"

,

"C:Python35lib"

,

"C:Python35"

,

"C:Python35libsite-packages"

]




添加默認的環境變數,當前生效





sys.path.append("PATH_NAME")




可以使用imp模塊中的reload方法重新載入某個模塊的方法,例如下面的實例:





$

cat

simple

.

py


#!/use/bin/env python


 


print

(

"Hello, World!"

)


spam

=

1





>>>

import simple


Hello

,

World

!


>>>

simple

.

spam


1


>>>

simple

.

spam

+=

1


>>>

import

simple


>>>

simple

.

spam


2


>>>

import

imp


>>>

imp

.

reload

(

simple

)


Hello

,

World

!


 


>>>

simple

.

spam


1




模塊導入順序






  1. 先在當前腳本目錄尋找有沒有與導入模塊名稱相同的文件,如果有就把這個文件當作模塊導入(據不完全統計,這是個坑,測試re模塊沒有問題,但是測試sys模塊就有問題了)



  2. 查找模塊路徑下面有沒有對應的模塊名



  3. 如果沒有找到模塊名就報錯




import是如何工作的?




模塊在被導入的時候會執行以下三個步驟:






  1. 通過環境變數找到模塊文件;



  2. 編譯成位元組碼文件,如果有位元組碼文件則導入位元組碼文件;



  3. 執行模塊中的代碼來創建所定義的對象;




以上的三個步驟只有在程序運行時,模塊被第一次導入時才會進行。如果已經導入了這個模塊然後再次導入的時候會跳過上面的三個步驟,它會直接提取內存中已經載入的模塊對象。Python已經導入的模塊會保存在sys.modules字典中。




_X與__all__




在模塊中的所有變數以_開頭的都不會被from *所導入





$

cat

simple

.

py


#!/use/bin/env python


 


_spam1

=

1


spam2

=

1





>>>

from simple import *


>>>

dir

()


# _spam1沒有被導入


[

"__builtins__"

,

"__doc__"

,

"__name__"

,

"__package__"

,

"spam2"

]




相反的__all__列表裡面的變數則會被from *所導入,沒有在__all__列表裡面的變數則不會被導入





$

cat

simple

.

py


#!/use/bin/env python


 


__all__

=

[

"spam2"

]


 


spam1

=

1


spam2

=

1





>>>

from simple import *


>>>

dir

()


# spam1沒有被導入


[

"__builtins__"

,

"__doc__"

,

"__name__"

,

"__package__"

,

"spam2"

]




注意事項




據不完全統計,如果導入的模塊的名稱在當前目錄下有這個文件,那麼只會把當前目錄下的這個文件當作模塊,如下演示:




創建一個腳本文件,名稱為scripts





[root@iZ28i253je0Z ~]# touch scripts.py




內容為





#!/usr/bin/env python


# _*_ coding:utf-8 _*_


# 導入一個模塊re


import

re


# 輸出匹配到的字元串abc


print

(

re

.

match

(

"w+"

,

"abc"

).

group

())




執行腳本





[

root

@

iZ28i253je0Z

~

]

# python scripts.py


# 把匹配到的結果abc輸出出來


abc




創建一個.py文件,名稱為re.py





[root@iZ28i253je0Z ~]# touch re.py




內容為





#!/usr/bin/env python


# _*_ coding:utf-8 _*_


# 輸出內容modus


print

(

"Hello Word"

)




再次執行scripts.py腳本





[

root

@

iZ28i253je0Z

~

]

# python scripts.py


# 先輸出Hello Word


Hello

Word


# 然後再報錯沒有match這個方法


Traceback

(

most recent call

last

)

:


  

File

"scripts.py"

,

line

6

,

in


    

print

(

re

.

match

(

"w+"

,

"abc"

).

group

())


AttributeError

:

"module"

object

has no

attribute

"match"




這是為什麼呢?因為python把re.py當成模塊re了,繼續往下看:




更改scripts.py文件內容如下





[

root

@

iZ28i253je0Z

~

]

# cat scripts.py


#!/usr/bin/env python


# _*_ coding:utf-8 _*_


 


import

re




re.py文件內容不變,然後我們在執行腳本scripts.py





[

root

@

iZ28i253je0Z

~

]

# python scripts.py


Hello

Word




看到了吧,他會把re.py文件內的代碼拿到scripts.py文件中去執行,這是個坑,最好別踩。




導入當前目錄下子目錄下的文件





[

root

@

ansheng

~

]

# tree ./


.

/


├──

modules


│  

├──

__init__

.

py


│  

├──

lib01

.

py


│  

└──

lib02

.

py


└──

scripts

.

py


 


1

directory

,

4

files


[

root

@

ansheng

~

]

# cat scripts.py


#!/usr/bin/env python


# 導入modules包下面的lib01模塊


from modules import

lib01


# 導入modules包下面的lib02模塊


from modules import

lib02


[

root

@

ansheng

~

]

# cat modules/__init__.py


#!/usr/bin/env python


[

root

@

ansheng

~

]

# cat modules/lib01.py


#!/usr/bin/env python


# lib01.py文件會輸出"Hello lib01"


print

(

"Hello lib01"

)


[

root

@

ansheng

~

]

# cat modules/lib02.py  


#!/usr/bin/env python


# lib02.py文件會輸出"Hello lib02"


print

(

"Hello lib02"

)




執行結果





[

root

@

ansheng

~

]

# python scripts.py


# 會執行modules/lib02.py與modules/lib01.py文件內容


Hello lib01


Hello

lib02




包含目錄下的文件時需要在目錄下聲明一個__init__.py文件,即使這個文件是空的也可以。






  • 來源:i安生




  • https://segmentfault.com/a/1190000008244138



  • Python開發整理髮布,轉載請聯繫作者獲得授


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

Python 標準庫之 collections 使用教程
用 greenlet 實現 Python 中的並發

TAG:Python開發 |