當前位置:
首頁 > 最新 > python的模塊module介紹

python的模塊module介紹

引言

我們知道,Verilog語言的模塊是最底層的功能部件,底層模塊在其它模塊里被例化,然後又在頂層模塊里被例化。這樣一級級、一層層構成了一個大項目。

本文共計2500字,閱讀大概需要20分鐘。

概要:

  • 模塊是一塊積木,是最基本的功能單位

  • 一切都是以模塊的形式存在的

  • 再來理解if __name__ == "__main__"

  • 模塊的搜索路徑sys.path和PYTHONPATH

  • 安何安裝模塊(以numpy為例,重點講離線、非管理員許可權安裝)

  • 從源碼開始安裝Tk庫

模塊是一塊積木

在python語言里也一樣,模塊是最基本的功能單位。我們寫一個python腳本,通常需要導入(import)其它模塊。比如,如果我們打算獲取命令行參數,就需要import sys。如果我們打算新建文件夾,就需要import os。又如果我們打算使用科學計算,就需要import numpy。在python的PyPI ( https://pypi.python.org/pypi ) 里的第三方模塊包已經超過12萬個。所以絕大部分時候,我們並不需要從零開始造輪子。

一切都是以模塊的形式存在的

在python里,一切都是以模塊的形式存在的。可能有人反駁道,他寫了一個最簡單的Hello world腳本(如下面的hello_world.py),並沒有用到、也沒有導入任何其它模塊。

print("Hello world")#僅此一行

但實際情況是什麼呢?python解釋器在啟動的時候已經幫我們自動導入一個名叫builtins的模塊。我們用dir()來幫助理解這一點。在python命令行里輸入dir(__builtins__),輸出如下的列表:

>>> dir(__builtins__)

[..., "abs", "all", "any", "ascii", "bin", "bool", "breakpoint", "bytearray", "bytes", "callable", "chr", "classmethod", "compile", "complex", "copyright", "credits", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "exec", "exit", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "license", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "print", "property", "quit", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip"]

是不是發現了這裡面包括了print函數(紅色)?此處稍微思考一會兒。。。很神奇是吧。是不是還發現了很多常用的函數(藍色)?所以,不需要導入任何模塊就可以直接使用的函數正是builtins模塊中的函數。

之前講函數作用域時講過,查找變數的規則是「由內向外、由近及遠」。這裡的「遠」就是指builtins模塊。如果一直找到builtins模塊,仍然沒有找到變數的定義,就會報變數未定義的錯誤。

再來理解if __name__ == "__main__"

一般來說,在python里模塊名字就是文件名。我們可以通過內置變數__name__來讀取模塊名。例如:

>>> print(__name__)

__main__

>>> import sys

>>> print(sys.__name__)

sys

>>> import os

>>> print(os.__name__)

os

當前正在執行的腳本被賦予的模塊名字是__main__,相當於C語言的入口函數main()。在《我的第一個Python程序》里,我們寫了如下圖的程序。我們判斷模塊的名字是不是__main__來決定要不要調用main(argv)函數。這樣寫的好處是什麼呢?當這個腳本被當作模塊來做集成時,模塊名是文件名hello(而__main__變成是import hello模塊的上層腳本),if __name__ == "__main__"條件裡面的語句不會執行。

如果沒有if __name__ == "__main__"這一行,在被其它模塊導入後,main(argv)會執行兩次。

例如下面的例子,有hello_world.py和test.py,位於同一個目錄下。

#hello_world.py

defprint_hello():

print("hello world")

print_hello()#沒有放在if里

#test.py

importhello_world

hello_world.print_hello()#調用函數

結果輸出

> python test.py

hello world

hello world

輸出了兩次hello world?你沒看錯。一次是hello_world.py里的,另一次是test.py里的。

所以,if __name__ == "__main__"這句的作用就是,讓腳本既可以直接當作執行腳本,又可以作當模塊被導入。

模塊的搜索路徑

上面的例子里,我們導入自己寫的hello_world模塊時提到,須和test.py位於同一個文件夾下。就是說,test.py在import時會在當前目錄下查找叫做hello_world.py的文件。

我們可能會有疑問,如果項目做大了必須要分子目錄了怎麼辦?安裝第三方模塊時是默認安裝到了系統目錄里,python是如何找到的?又如,如果伺服器上安裝好幾個版本numpy模塊庫,我們該怎麼指定需要的版本?

想搞清楚這些問題,我們就需要先搞清楚python查找模塊的規則。我們知道linux在查找可執行命令時是安照PATH環境變數的順序。類似地,python按照sys.path的順序來查找模塊定義。比如,windows環境下,我們把sys.path列印出來,如下:

>>> import sys

>>> print(sys.path)

["", "C:\Python\Python36\python36.zip", "C:\Python\Python36\DLLs", "C:\Python\Python36\lib", "C:\Python\Python36", "C:\Python\Python36\lib\site-packages"]

我們可以看到,sys.path其實是列表,裡面存著一個個路徑。python按照列表的先後順序,逐個目錄查找,直到找到模塊定義。知道了這一點,我們就可以根據需要手工改造sys.path的列表,比如把我們自己寫的模塊目錄insert到sys.path的一開頭,比如delete掉某個不需要的目錄,比如調換兩個目錄的順序,等等。(點這裡回顧一下列表有哪些操作函數)

另外python啟動時還會讀取PYTHONPATH的環境變數,並insert到sys.path的一開頭。因此,我們也可以修改PYTHONPATH來指定需要的模塊所在目錄。我們需要結合實際,決定是修改PYTHONPATH還是直接修改sys.path。看哪個可行,看哪個更方便。

如何安裝模塊

如果你的伺服器可以聯網,那麼恭喜你,你只需要一個命令pip install xxx就可以安裝第三方模塊。pip是python安裝第三方模塊的工具。比如,如果你需要安裝numpy,只需要pip install numpy即可,安裝過程中會自動下載安裝依賴包。

有些童鞋立即試了試,卻發現「沒有pip命令」?那很可能是沒有安裝pip,或者沒有正確設置PATH環境變數。

windows環境下,先看看python安裝目錄下的scripts文件夾里有沒有pip.exe。如果有,就添加C:Python36Scripts到環境變數。如下圖。

如果Scripts文件夾里沒有pip.exe,就需要安裝pip了。在控制面板->添加刪除軟體的找到python,右鍵點更改,再勾上pip。如下圖。

但我們的伺服器一般是Linux,如果確認Scripts目錄沒有pip,就需要去官網下載pip源碼包來安裝。下載地址:https://pypi.python.org/pypi/pip/9.0.1,找到pip-9.0.1.tar.gz。解壓縮後,用命令python setup.py install安裝。

但是,但是,有不少童鞋說,「我們伺服器不能連網,也沒有管理員許可權」。不用擔心,這種情況下,我們需要下載好numpy源碼包和所有的依賴包,手動安裝到自己的HOME目錄或者指定的目錄。

源碼包去哪裡下載?當然是去python官網,https://pypi.python.org/pypi。那麼怎麼知道要哪些依賴包呢?不用擔心,如果缺少依賴包,安裝時會報錯。缺什麼補什麼。我整理了安裝numpy和matplotlib可能需要的依賴包,見百度網盤https://pan.baidu.com/s/1htmgfYG。

一般來說,安裝源碼包安裝方法是python setup.py install --prefix /home/xxx,其中,--prefix指定安裝到自己的HOME目錄下,因為我們沒有管理員許可權。

部分第三方模塊,不需要安裝,只要解壓至一個目錄,並加到python的模塊搜索路徑即可使用。如果遇到某些包實在無法安裝,可以試試這種方法。

這裡順便介紹一下,如何安裝Tcl和Tk包。一些童鞋在安裝matplotlib模塊庫時,發現python缺少Tk庫。分兩種情況,如果Linux伺服器能聯網,且有管理員許可權,則優先選用yum install xxx(RHEL、CentOS)或者apt_get install xxx(Ubantu、Debian)。另一種情況就下沒聯網、沒許可權,我們下面簡單介紹一下源碼安裝的步驟。

一般情況下,到這裡,你已經可以在python中import tkinter了。但如果你的python也是自己用源碼編譯安裝的話,那很可能你需要重新編譯安裝python。方法如下:

預告

下一次,我們將介紹如何把自己的python腳本做成模塊。

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

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


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

為什麼選擇python

TAG:ExASIC |