M15 — Môi trường ảo và pip

← 14 - Lập trình hướng đối tượng (OOP) | Tiếp theo → 16 - Python kết nối Database

Mục tiêu module

  • Hiểu vì sao cần virtual environment (môi trường ảo)
  • Tạo và kích hoạt venv
  • Cài đặt, gỡ bỏ, quản lý thư viện bằng pip
  • Dùng requirements.txt để chia sẻ dự án

Thời lượng: ~4 giờ | Tuần: 24


1. Vấn đề: Dependency Hell

Giả sử bạn có 2 dự án:

Dự ánYêu cầu
Dự án A (cũ, đang chạy production)pandas phiên bản 1.5
Dự án B (mới)pandas phiên bản 2.2

Nếu cài thư viện vào Python hệ thống, chỉ tồn tại một phiên bản duy nhất trên máy. Cài pandas 2.2 cho dự án B → dự án A hỏng.

Đây gọi là dependency hell (địa ngục phụ thuộc).

Vấn đề thứ hai — “Máy tôi chạy được”

Bạn viết chương trình dùng 5 thư viện. Gửi code cho đồng nghiệp → họ chạy báo ModuleNotFoundError. Không ai nhớ chính xác đã cài những gì, phiên bản nào.


2. Giải pháp: Virtual Environment

Virtual environment (môi trường ảo) là một bản Python độc lập nằm trong thư mục dự án, có bộ thư viện riêng.

D:\du_an\
├── du_an_a\
│   ├── .venv\           <- Python + pandas 1.5 riêng cho A
│   └── main.py
└── du_an_b\
    ├── .venv\           <- Python + pandas 2.2 riêng cho B
    └── main.py

Hai dự án không ảnh hưởng nhau. Xóa thư mục .venv là gỡ sạch, không để lại gì trên hệ thống.

Liên hệ với công việc của bạn

Giống như việc bạn tạo nhiều database instance riêng cho từng môi trường (DEV, UAT, PRODUCTION) thay vì dùng chung một instance. Mỗi môi trường có phiên bản schema, dữ liệu riêng, không đụng nhau.


3. Tạo và dùng venv

Bước 1 — Tạo môi trường ảo

Mở terminal, cd vào thư mục dự án:

cd D:\hoc-python\du_an_ban_hang
python -m venv .venv

Lệnh này tạo thư mục .venv chứa bản Python riêng.

Vì sao tên là .venv?

Đây là quy ước phổ biến nhất. Dấu chấm đầu tên khiến nó ẩn trên Linux/macOS. Các IDE (VS Code, PyCharm) tự động nhận diện thư mục tên .venv hoặc venv.

Bước 2 — Kích hoạt (activate)

Windows — Command Prompt:

.venv\Scripts\activate

Windows — PowerShell:

.venv\Scripts\Activate.ps1

Linux / macOS:

source .venv/bin/activate

Khi kích hoạt thành công, dấu nhắc terminal có thêm (.venv):

(.venv) D:\hoc-python\du_an_ban_hang>

Bước 3 — Kiểm tra

where python

Kết quả phải trỏ vào thư mục .venv:

D:\hoc-python\du_an_ban_hang\.venv\Scripts\python.exe
D:\...\Programs\Python\Python314\python.exe

Dòng đầu là môi trường ảo → đang hoạt động đúng.

Bước 4 — Thoát (deactivate)

deactivate

⚠️ Lỗi PowerShell trên Windows

.venv\Scripts\Activate.ps1 : File cannot be loaded because running scripts
is disabled on this system.

Nguyên nhân: Chính sách thực thi script của PowerShell.

Cách sửa — mở PowerShell (không cần quyền Admin) và chạy:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Hoặc đơn giản hơn: dùng Command Prompt (cmd) thay vì PowerShell.

Kích hoạt trong VS Code

VS Code tự nhận diện .venv. Nếu không:

  1. Ctrl + Shift + P → Python: Select Interpreter
  2. Chọn dòng có ('.venv': venv)
  3. Mở terminal mới trong VS Code — nó tự kích hoạt

4. pip — Trình quản lý thư viện

pip = Pip Installs Packages. Nó tải thư viện từ PyPI (Python Package Index — https://pypi.org), kho chứa hơn 500.000 gói.

4.1. Các lệnh cơ bản

# Cài đặt
pip install requests
 
# Cài phiên bản cụ thể
pip install requests==2.31.0
 
# Cài phiên bản tối thiểu
pip install "requests>=2.30"
 
# Cài trong khoảng
pip install "requests>=2.30,<3.0"
 
# Nâng cấp
pip install --upgrade requests
 
# Gỡ bỏ
pip uninstall requests
 
# Liệt kê đã cài
pip list
 
# Xem chi tiết một gói
pip show requests
 
# Kiểm tra gói lỗi thời
pip list --outdated
 
# Nâng cấp chính pip
python -m pip install --upgrade pip

Dùng python -m pip thay vì pip

python -m pip install requests

Cách này đảm bảo pip chạy đúng với bản Python đang kích hoạt. Nếu máy có nhiều bản Python, gõ pip trơn có thể cài nhầm chỗ.

4.2. Kiểm chứng môi trường ảo hoạt động

# Chưa kích hoạt venv
pip list
# -> Danh sách dài các gói hệ thống
 
# Sau khi kích hoạt venv
.venv\Scripts\activate
pip list
# -> Chỉ có pip và vài gói cơ bản — môi trường sạch

5. requirements.txt

5.1. Xuất danh sách thư viện

pip freeze > requirements.txt

Nội dung file:

certifi==2026.6.15
charset-normalizer==3.4.2
idna==3.10
requests==2.32.4
urllib3==2.5.0

5.2. Cài đặt lại từ file

Trên máy khác (hoặc sau khi xóa .venv):

python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt

Toàn bộ thư viện được cài lại đúng phiên bản.

5.3. pip freeze vs viết tay

pip freeze liệt kê tất cả, kể cả thư viện phụ thuộc gián tiếp. Với dự án nhỏ, có thể viết tay file gọn hơn:

# requirements.txt
requests>=2.30
pandas>=2.0,<3.0
openpyxl

Rồi cài:

pip install -r requirements.txt
pip freeze > requirements.lock.txt    # Ghi lại phiên bản chính xác đã cài

Quy trình chuẩn khi nhận một dự án Python

git clone <dia-chi-repo>        # hoặc giải nén file zip
cd <thu-muc-du-an>
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.py

Bốn dòng này là “nghi thức” bạn sẽ lặp lại suốt sự nghiệp.


6. Cấu trúc dự án Python chuẩn

du_an_ban_hang/
├── .venv/                   <- Môi trường ảo (KHÔNG chia sẻ, KHÔNG commit lên Git)
├── .gitignore               <- Danh sách file bỏ qua khi dùng Git
├── README.md                <- Hướng dẫn cài đặt và sử dụng
├── requirements.txt         <- Danh sách thư viện
├── main.py                  <- Điểm khởi chạy
├── cau_hinh.py
├── src/                     <- Mã nguồn
│   ├── __init__.py
│   ├── tien_ich.py
│   ├── nghiep_vu.py
│   └── models.py
├── du_lieu/                 <- File dữ liệu
│   └── khach_hang.csv
└── bao_cao/                 <- Kết quả xuất ra

File .gitignore

# Môi trường ảo
.venv/
venv/
env/
 
# Bytecode Python
__pycache__/
*.py[cod]
*.pyc
 
# File cấu hình cá nhân
.env
cau_hinh_local.json
 
# IDE
.vscode/
.idea/
 
# Dữ liệu và kết quả
bao_cao/*.csv
*.log
 
# Hệ điều hành
Thumbs.db
.DS_Store

KHÔNG BAO GIỜ commit thư mục .venv lên Git

Nó nặng hàng trăm MB, chứa file nhị phân riêng cho từng hệ điều hành, và hoàn toàn tái tạo được từ requirements.txt. Chia sẻ requirements.txt là đủ.

File README.md

# Hệ thống quản lý bán hàng
 
## Yêu cầu
- Python 3.13 trở lên
 
## Cài đặt
 
```bash
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
```
 
## Chạy
 
```bash
python main.py
```
 
## Cấu trúc
- `main.py` — điểm khởi chạy
- `src/nghiep_vu.py` — logic tính toán
- `du_lieu/` — file dữ liệu đầu vào

7. Các thư viện phổ biến (tham khảo, chưa cần học)

Sau khi hoàn thành lộ trình 26 tuần, đây là các thư viện đáng học tiếp cho công việc của bạn:

Thư việnCông dụngCài đặt
pandasXử lý dữ liệu bảng — như Excel bằng codepip install pandas
openpyxlĐọc/ghi file Excel .xlsxpip install openpyxl
requestsGọi API HTTPpip install requests
pyodbcKết nối SQL Serverpip install pyodbc
psycopg[binary]Kết nối PostgreSQLpip install "psycopg[binary]"
SQLAlchemyORM — làm việc với DB qua objectpip install SQLAlchemy
python-dotenvĐọc biến môi trường từ file .envpip install python-dotenv
tabulateIn bảng đẹp ra terminalpip install tabulate
pytestViết kiểm thử tự độngpip install pytest
ruffKiểm tra và định dạng codepip install ruff

Thử nghiệm nhanh

python -m venv .venv
.venv\Scripts\activate
pip install tabulate
from tabulate import tabulate
 
du_lieu = [
    ["KH001", "Nguyễn Văn A", 5_000_000],
    ["KH002", "Trần Thị B", 12_000_000],
    ["KH003", "Lê Văn C", 0],
]
 
print(tabulate(du_lieu,
               headers=["Mã KH", "Tên khách hàng", "Công nợ"],
               tablefmt="grid",
               floatfmt=",.0f"))
+---------+------------------+-----------+
| Mã KH   | Tên khách hàng   |   Công nợ |
+=========+==================+===========+
| KH001   | Nguyễn Văn A     |   5000000 |
+---------+------------------+-----------+
| KH002   | Trần Thị B       |  12000000 |
+---------+------------------+-----------+
| KH003   | Lê Văn C         |         0 |
+---------+------------------+-----------+

8. An toàn khi cài thư viện

Không phải gói nào trên PyPI cũng an toàn

Bất kỳ ai cũng đăng gói lên PyPI được. Đã có nhiều vụ typosquatting — kẻ xấu đăng gói tên gần giống gói phổ biến (requets thay vì requests) chứa mã độc.

Checklist trước khi cài một thư viện lạ:

Kiểm traCách làm
Gõ đúng tên chưa?Đối chiếu với tài liệu chính thức
Bao nhiêu lượt tải?Xem trên https://pypi.org — gói uy tín có hàng triệu lượt/tháng
Có mã nguồn công khai không?Tìm link GitHub trên trang PyPI
Cập nhật gần đây không?Gói bỏ hoang 5 năm thường có lỗ hổng bảo mật
Có bao nhiêu sao trên GitHub?Chỉ báo tham khảo về mức độ tin cậy

Kiểm tra gói đã cài có lỗ hổng không:

pip install pip-audit
pip-audit

9. Thực hành bắt buộc

Bài 1 — Tạo môi trường ảo

  1. Tạo thư mục D:\hoc-python\tuan-24\thu-nghiem
  2. Tạo môi trường ảo .venv
  3. Kích hoạt, chạy where python và pip list, ghi kết quả vào nhật ký
  4. Thoát bằng deactivate, chạy lại pip list, so sánh khác biệt

Bài 2 — Cài đặt thư viện

Trong môi trường ảo vừa tạo:

  1. Cài tabulate
  2. Chạy pip list, pip show tabulate
  3. Viết chương trình dùng tabulate in bảng dữ liệu khách hàng
  4. Chạy pip freeze > requirements.txt, mở file xem nội dung

Bài 3 — Tái tạo môi trường

  1. Xóa toàn bộ thư mục .venv
  2. Chạy chương trình → xác nhận báo ModuleNotFoundError
  3. Tạo lại .venv, cài từ requirements.txt
  4. Chạy lại → hoạt động bình thường

Bài 4 — Hai môi trường độc lập

  1. Tạo 2 thư mục dự án riêng, mỗi thư mục một .venv
  2. Dự án 1: cài tabulate
  3. Dự án 2: cài requests
  4. Kiểm chứng: trong dự án 1, import requests phải báo lỗi

Bài 5 — Đóng gói dự án

Lấy dự án so_thu_chi bạn viết ở 14 - Lập trình hướng đối tượng (OOP) bài 7, đóng gói hoàn chỉnh:

  • Tạo .venv
  • Tạo requirements.txt
  • Tạo .gitignore
  • Viết README.md có hướng dẫn cài đặt
  • Sắp xếp lại cấu trúc thư mục theo chuẩn ở mục 6
  • Gửi thư mục (không kèm .venv) cho một người khác, xem họ có tự chạy được không

Bài 6 — Khám phá PyPI

Vào https://pypi.org, tìm hiểu 3 thư viện bất kỳ liên quan tới công việc của bạn (kế toán, Excel, database). Với mỗi thư viện ghi lại: tên, công dụng, số lượt tải/tháng, ngày cập nhật gần nhất, link GitHub.


10. Tự kiểm tra

  • Tôi giải thích được vì sao cần môi trường ảo
  • Tôi tạo, kích hoạt, thoát được venv
  • Tôi biết kiểm chứng venv đang hoạt động bằng where python
  • Tôi biết các lệnh pip install, list, show, uninstall, freeze
  • Tôi biết tạo và dùng requirements.txt
  • Tôi biết không được commit .venv lên Git
  • Tôi biết cách kiểm tra một thư viện có đáng tin không
  • Tôi biết cấu trúc thư mục dự án Python chuẩn

11. Tài liệu chính thức

NguồnNội dungLink
venv moduleTài liệu môi trường ảohttps://docs.python.org/3/library/venv.html
Installing PackagesHướng dẫn cài gói chính thứchttps://packaging.python.org/en/latest/tutorials/installing-packages/
Python Packaging User GuideToàn bộ về đóng góihttps://packaging.python.org/
pip documentationTài liệu piphttps://pip.pypa.io/en/stable/
PyPIKho thư việnhttps://pypi.org/
Tutorial — Virtual EnvironmentsNhập môn venvhttps://docs.python.org/3/tutorial/venv.html

Tiếp theo → 16 - Python kết nối Database