Python 模組與套件

Python 模組與套件(Modules and Packages)

這篇 Python import 教學將帶你認識模組(module)與套件(package):當程式越寫越大,不可能全部塞在一個檔案,模組就是「一個 .py 檔」,套件是「一個裝著多個模組的資料夾」。猜數字遊戲用過的 import random,現在來搞懂它。

import 的各種寫法

寫法用法呼叫方式
import random匯入整個模組random.randint(1, 10)
import random as rd取別名rd.randint(1, 10)
from random import randint只匯入需要的名稱randint(1, 10)
from random import *全部倒進來(不建議randint(1, 10)
import random
from math import sqrt, pi

print(random.randint(1, 6))   # 擲骰子(你的結果可能不同)
print(sqrt(16))
print(pi)

執行輸出:

4
4.0
3.141592653589793

from x import * 不建議:分不清名稱從哪來,還可能蓋掉既有的變數。

常用的內建模組

Python「內建電池」非常豐富,這些之後的文章都會用到:

模組用途
random隨機數
math數學運算
datetime日期時間(第 34 篇)
jsonJSON 處理(第 33 篇)
ospathlib檔案與路徑
re正規表達式(第 35 篇)

建立自己的模組

模組就是一個 .py 檔。假設有個 mytools.py

# mytools.py
def add(a, b):
    return a + b

PI = 3.14159

同資料夾的另一個檔案就能匯入使用:

# main.py
import mytools

print(mytools.add(3, 5))
print(mytools.PI)

執行輸出:

8
3.14159

套件則是裝著模組的資料夾,用 from 資料夾.檔名 import 名稱 一路點進去。

if __name__ == “__main__” 是什麼

模組被匯入時,整個檔案會被執行一次。如果 mytools.py 裡有測試用的 print,別人 import 它時也會跑出來。解法是入口判斷:

# mytools.py
def add(a, b):
    return a + b

if __name__ == "__main__":
    # 只有「直接執行這個檔案」才會跑,被 import 不會
    print("測試:", add(3, 5))

原理:直接執行時 __name__"__main__";被 import 時是模組名 "mytools"。這行慣例幾乎每個正式的 Python 檔案都有。

常見錯誤

1. ModuleNotFoundError: No module named ‘xxx’

三種可能:(1)名稱打錯;(2)第三方套件還沒安裝(下一篇 uv 會教 uv add);(3)自訂模組不在執行目錄。先確認檔案位置與名稱拼字。

2. 檔名跟模組撞名

把檔案取名 random.pyimport random,會匯入你自己的檔案,報出莫名其妙的 AttributeError。自己的檔名避開內建模組名

3. ImportError: cannot import name ‘xxx’

from mytools import addd 名稱拼錯,或該模組裡根本沒有這個名稱。用 dir(mytools) 可以列出模組裡所有名稱。

總結

模組=.py 檔、套件=資料夾;import x 全拿、from x import y 只拿需要的、避免 import *;每個正式檔案都該有 if __name__ == "__main__": 入口。撞名與拼錯是 ModuleNotFoundError 的最大宗。下一篇學會用 uv 管理虛擬環境與第三方套件。

延伸閱讀