← Lập trình Python cơ bản

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:

Hai dự án cần phiên bản tools khác nhau. Cách cài:
Dự án A
cần tools 1.0 · nhận tools 2.0
✗ VỠ - sai phiên bản
Dự án B
cần tools 2.0 · nhận tools 2.0
✓ chạy được
↓ cùng dùng ↓
site-packages dùng chung (toàn máy)
tools 2.0
chỉ chứa được MỘT phiên bản
Xung đột! Một site-packages dùng chung chỉ giữ được một phiên bản, nên dự án cần bản kia bị vỡ. Đó là lý do KHÔNG nên cài thẳng vào Python toàn máy.

Tạo venv kiểu cổ điển

Python có sẵn: python -m venv .venv tạo môi trường, rồi source .venv/bin/activate (macOS/Linux) để “bước vào”, sau đó pip install sẽ cài vào ĐÓ chứ không phải toàn máy. Gọn hơn nhiều là để uv lo (Bước 5).

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ệcCổ điển (pip + venv)uv
Tạo môi trườngpython -m venv .venvuv venv
Thêm thư việnpip install requestsuv add requests
Chạypython main.pyuv 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.

Bài “Tự viết & đóng gói thư viện (packaging)” - khoá Python nâng cao →

Vì hai dự án có thể cần PHIÊN BẢN khác nhau của cùng một thư viện. Cài chung vào Python toàn máy thì chỉ giữ được một phiên bản → một dự án vỡ. Mỗi dự án một “môi trường ảo” (.venv) riêng giúp thư viện không đụng nhau (xem Bước 4).

uv là công cụ hiện đại (viết bằng Rust, RẤT nhanh) lo trọn vòng đời: cài Python, tạo dự án, tạo môi trường ảo, thêm/khoá thư viện, và chạy. Nó thay được pip + venv (và còn hơn). Khoá này khuyên dùng uv; pip/venv vẫn nên biết vì gặp khắp nơi.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Khối if __name__ rồi so với chuỗi __main__ được dùng để làm gì?

  1. 1

    Dùng thư viện chuẩn

    import random rồ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. 2

    Tách module

    Viết tinh.py có hàm cong(a, b), rồi từ main.py import và gọi nó.

    Hoàn thành khi: from tinh import cong; print(cong(2, 3)) → 5.

  3. 3

    __name__

    Thêm vào tinh.py khối if __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__"__main__").

  4. 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-packages chung chỉ giữ một phiên bản.

  5. 5

    Tạo dự án với uv

    Trên máy: uv init myapp; cd myapp; uv add requests; uv run main.py. uv tạo những gì?

    Hoàn thành khi: pyproject.toml (khai báo phụ thuộc) + .venv riêng; uv run chạy trong môi trường đó.

  6. 6

    uv vs pip+venv

    Viết cặp lệnh tương đương: tạo venv + cài requests bằ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.