Bài 10 · Vận dụng · 22 phút· Cập nhật 11/06/2026
Module, gói & môi trường ảo
Biên soạn bởi Nguyễn Anh Tuấn
import, __name__; môi trường ảo (venv) & quản lý gói hiệu quả với uv (nhanh, Rust) - cùng pip cổ điển.
Mỗi tệp .py là một module. Bạn import module để dùng lại code - kể cả kho thư viện chuẩn đồ sộ đi kèm Python:
dung_thu_vien.py
import math
import json
print(math.sqrt(16)) # ham tu module math
print(json.dumps({"a": 1})) # doi dict -> chuoi JSON Kết quả khi chạy
4.0
{"a": 1}- ▸import math → dùng math.sqrt(...); from math import sqrt → dùng sqrt(...).
- ▸import math as m đặt bí danh; tránh from x import * (kéo hết tên).
- ▸Thư viện chuẩn: math, random, json, datetime, os, pathlib… - có sẵn ngay khi cài Python (“batteries included”).
Khi chạy trực tiếp một tệp, Python đặt __name__ = "__main__"; khi tệp bị import, __name__ là tên module. Dùng điều này để code “điểm khởi động” chỉ chạy khi gọi trực tiếp - đúng mẫu bạn sẽ dùng cho 3 app dòng lệnh cuối khoá:
mymod.py - chạy trực tiếp: python mymod.py
def chao():
print("Xin chao tu module")
print("__name__ =", __name__)
if __name__ == "__main__":
print("Chay truc tiep!")
chao() Kết quả khi chạy
__name__ = __main__ Chay truc tiep! Xin chao tu module
main.py - import mymod (khối __main__ KHÔNG chạy)
import mymod
print("Da import xong") Kết quả khi chạy
__name__ = mymod Da import xong
- ▸Chạy trực tiếp → __name__ == "__main__"; bị import → __name__ == tên module.
- ▸Đặt phần chạy thử / điểm khởi động trong if __name__ == "__main__":.
- ▸Nhờ vậy import module KHÔNG vô tình chạy phần thử nghiệm của nó.
Ngoài thư viện chuẩn, có PyPI - kho hàng trăm nghìn thư viện. Công cụ cổ điển để cài là pip. Nhưng cài thẳng vào Python toàn máy sinh vấn đề: hai dự án cần hai phiên bản khác nhau sẽ đụng nhau.
- ▸PyPI: kho thư viện bên thứ ba; pip install <tên> để cài.
- ▸Cài toàn máy = một “site-packages” dùng chung cho mọi dự án.
- ▸Hai dự án cần phiên bản khác nhau → chỉ giữ được một → xung đột.
Giải pháp: mỗi dự án một môi trường ảo (virtual environment, thư mục .venv) - như một “Python tí hon” riêng với thư viện của riêng dự án. Đổi chế độ để thấy khác biệt:
Tạo venv kiểu cổ điển
uv (viết bằng Rust) lo trọn vòng đời và nhanh hơn pip/venv nhiều lần - cũng chính là công cụ cài đặt Python mà khoá này giới thiệu (đọc & cài uv). Nó tự tạo .venv cho dự án và khoá phiên bản trong pyproject.toml:
vòng đời một dự án với uv
uv python install 3.13 # cai Python 3.13 (uv tu quan ly)
uv init myapp # tao du an: pyproject.toml + main.py
cd myapp
uv add requests # them thu vien -> tu tao .venv, ghi pyproject
uv run main.py # chay trong moi truong cua du an | Việc | Cổ điển (pip + venv) | uv |
|---|---|---|
| Tạo môi trường | python -m venv .venv | uv venv |
| Thêm thư viện | pip install requests | uv add requests |
| Chạy | python main.py | uv run main.py |
- ▸uv lo cả Python, môi trường ảo, thư viện và chạy - một công cụ.
- ▸uv tự tạo .venv riêng cho dự án; pyproject.toml khoá phiên bản (tái lập được).
- ▸Cả khoá này (và khoá nâng cao) sẽ dùng uv để cài pytest, requests…
Câu hỏi thường gặp
Một MODULE là một tệp .py. Một GÓI (package) là một thư mục chứa nhiều module. THƯ VIỆN (library) là cách gọi chung cho code dùng lại được - có thể là một module, một gói, hoặc cả bộ (vd “thư viện chuẩn”).
import math rồi dùng math.sqrt(...). from math import sqrt thì dùng thẳng sqrt(...). import math as m đặt bí danh. Nên import rõ ràng; tránh from x import * (kéo HẾT tên vào, dễ đụng nhau).
Khi CHẠY TRỰC TIẾP một tệp (python mymod.py), Python đặt __name__ = "__main__". Khi tệp đó được IMPORT, __name__ = tên module ("mymod"). Đặt phần “chạy thử / điểm khởi động” trong if __name__ == "__main__": để nó chỉ chạy khi gọi trực tiếp, KHÔNG chạy khi bị import.
PyPI (Python Package Index) là kho thư viện bên thứ ba khổng lồ. pip là công cụ cổ điển để cài chúng (pip install requests). Tải “Python” thường kèm sẵn pip.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Khối if __name__ rồi so với chuỗi __main__ được dùng để làm gì?
- 1
Dùng thư viện chuẩn
import randomrồi in một số ngẫu nhiên 1..6 (random.randint(1, 6)).Hoàn thành khi:
import random; print(random.randint(1, 6))→ một số 1..6. - 2
Tách module
Viết
tinh.pycó hàmcong(a, b), rồi từmain.pyimport và gọi nó.Hoàn thành khi:
from tinh import cong; print(cong(2, 3))→ 5. - 3
__name__
Thêm vào
tinh.pykhốiif __name__ == "__main__": print("tu chay"). Khi import từmain.py, dòng đó có in không?Hoàn thành khi: Không - chỉ in khi chạy trực tiếp
python tinh.py(lúc đó__name__là"__main__"). - 4
Vì sao venv
Dùng công cụ Bước 4: ở chế độ “cài chung”, dự án nào vỡ và vì sao?
Hoàn thành khi: Dự án cần phiên bản KHÔNG phải bản cài sau cùng bị vỡ -
site-packageschung chỉ giữ một phiên bản. - 5
Tạo dự án với uv
Trên máy:
uv init myapp; cd myapp; uv add requests; uv run main.py.uvtạo những gì?Hoàn thành khi:
pyproject.toml(khai báo phụ thuộc) +.venvriêng;uv runchạy trong môi trường đó. - 6
uv vs pip+venv
Viết cặp lệnh tương đương: tạo venv + cài
requestsbằng (a) cách cổ điển, (b)uv.Hoàn thành khi: (a)
python -m venv .venv; source .venv/bin/activate; pip install requests. (b)uv add requests.