1. 程式人生 > 實用技巧 >模組和包——Python

模組和包——Python

目標

  • 模組
  • 釋出模組

01. 模組

1.1 模組的概念

1.2 模組的兩種匯入方式

模組是 Python 程式架構的一個核心概念

  • 每一個以副檔名py結尾的Python原始碼檔案都是一個模組
  • 模組名同樣也是一個識別符號,需要符合識別符號的命名規則
  • 在模組中定義的全域性變數函式都是提供給外界直接使用的工具
  • 模組就好比是工具包,要想使用這個工具包中的工具,就需要先匯入這個模組

1)import 匯入

import 模組名1
import 模組名2 

  • 匯入之後
    • 通過模組名.使用模組提供的工具——全域性變數函式
使用as指定模組的別名

如果模組的名字太長,可以使用as指定模組的名稱,以方便在程式碼中的使用

import 模組名1 as 模組別名

注意:模組別名應該符合大駝峰命名法

2)from...import 匯入

  • 如果希望從某一個模組中,匯入部分工具,就可以使用from ... import的方式
  • import 模組名一次性把模組中所有工具全部匯入,並且通過模組名/別名訪問
# 從 模組 匯入 某一個工具
from 模組名1 import 工具名

匯入之後
  • 不需要通過模組名.
  • 可以直接使用模組提供的工具——全域性變數函式

注意

如果兩個模組,存在同名的函式,那麼後匯入模組的函式,會覆蓋掉先匯入的函式

  • 開發時import程式碼應該統一寫在程式碼的頂部,更容易及時發現衝突
  • 一旦發現衝突,可以使用as關鍵字給其中一個工具起一個別名
from...import *(知道)
# 從 模組 匯入 所有工具
from 模組名1 import *

注意

這種方式不推薦使用,因為函式重名並沒有任何的提示,出現問題不好排查

1.3 模組的搜尋順序[擴充套件]

Python的直譯器在匯入模組時,會:

  1. 搜尋當前目錄指定模組名的檔案,如果有就直接匯入
  2. 如果沒有,再搜尋系統目錄

在開發時,給檔案起名,不要和系統的模組檔案

重名

Python中每一個模組都有一個內建屬性__file__可以檢視模組完整路徑

示例

import random

# 生成一個 0~10 的數字
rand = random.randint(0, 10)

print(rand)

注意:如果當前目錄下,存在一個random.py的檔案,程式就無法正常執行了!

  • 這個時候,Python的直譯器會載入當前目錄下的random.py而不會載入系統的random模組

1.4 原則 —— 每一個檔案都應該是可以被匯入的

  • 一個獨立的Python檔案就是一個模組
  • 在匯入檔案時,檔案中所有沒有任何縮排的程式碼都會被執行一遍!

實際開發場景

  • 在實際開發中,每一個模組都是獨立開發的,大多都有專人負責
  • 開發人員通常會在模組下方增加一些測試程式碼
    • 僅在模組內使用,而被匯入到其他檔案中不需要執行

__name__屬性

  • __name__屬性可以做到,測試模組的程式碼只在測試情況下被執行,而在被匯入時不會被執行
  • __name__Python的一個內建屬性,記錄著一個字串
  • 如果是被其他檔案匯入的__name__就是模組名
  • 如果是當前執行的程式__name____main__

在很多Python檔案中都會看到以下格式的程式碼

# 匯入模組
# 定義全域性變數
# 定義類
# 定義函式

# 在程式碼的最下方
def main():
    # ...
    pass

# 根據 __name__ 判斷是否執行下方程式碼
if __name__ == "__main__":
    main()

02. 包(Package)

概念

  • 是一個包含多個模組特殊目錄
  • 目錄下有一個特殊的檔案__init__.py
  • 包名的命名方式和變數名一致,小寫字母+_

好處

  • 使用import 包名可以一次性匯入所有的模組

案例演練

  1. 新建一個hm_message
  2. 在目錄下,新建兩個檔案send_messagereceive_message
  3. send_message檔案中定義一個send函式
  4. receive_message檔案中定義一個receive函式
  5. 在外部直接匯入hm_message的包

__init__.py

  • 要在外界使用中的模組,需要在__init__.py中指定對外界提供的模組列表
# 從 當前目錄 匯入 模組列表
from . import send_message
from . import receive_message

03. 釋出模組(知道)

如果希望自己開發的模組,分享給其他人,可以按照以下步驟操作

3.1 製作釋出壓縮包步驟

3.2 安裝模組

3.3pip安裝第三方模組

1) 建立 setup.py

setup.py的檔案

from distutils.core import setup

setup(name="hm_message",  # 包名
      version="1.0",  # 版本
      description="itheima's 傳送和接收訊息模組",  # 描述資訊
      long_description="完整的傳送和接收訊息模組",  # 完整描述資訊
      author="itheima",  # 作者
      author_email="[email protected]",  # 作者郵箱
      url="www.itheima.com",  # 主頁
      py_modules=["hm_message.send_message",
                  "hm_message.receive_message"])

有關字典引數的詳細資訊,可以參閱官方網站:

https://docs.python.org/2/distutils/apiref.html

2) 構建模組

$ python3 setup.py build

3) 生成釋出壓縮包

$ python3 setup.py sdist

注意:要製作哪個版本的模組,就使用哪個版本的直譯器執行!

$ tar -zxvf hm_message-1.0.tar.gz 

$ sudo python3 setup.py install

解除安裝模組

直接從安裝目錄下,把安裝模組的目錄刪除就可以

$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*

  • 第三方模組通常是指由知名的第三方團隊開發的並且被程式設計師廣泛使用Python包 / 模組
    • 例如pygame就是一套非常成熟的遊戲開發模組
  • pip是一個現代的,通用的Python包管理工具
  • 提供了對Python包的查詢、下載、安裝、解除安裝等功能

安裝和解除安裝命令如下:

# 將模組安裝到 Python 2.x 環境
$ sudo pip install pygame
$ sudo pip uninstall pygame

# 將模組安裝到 Python 3.x 環境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

Mac下安裝iPython

$ sudo pip install ipython

Linux下安裝iPython

$ sudo apt install ipython
$ sudo apt install ipython3