
Môi trường ảo Python (venv): tạo, kích hoạt, xóa
AIDev TeamTham vấn chuyên môn: Nguyễn Việt Chung
Đăng 12 phút đọc
Mục lục · 23
Môi trường ảo Python là một thư mục chứa bản Python và package riêng cho từng project, tạo bằng lệnh python -m venv .venv. Mình chạy đủ vòng tạo, kích hoạt, cài package, xuất requirements.txt rồi xóa trên cả Windows 10 lẫn Ubuntu 24.04. Mình gặp 5 lỗi thật và đo thời gian tạo của venv, virtualenv, uv.
Môi trường ảo Python (virtual environment, thường gọi tắt là venv) là một thư mục riêng của project, trong đó có một bản Python và các package (gói thư viện cài bằng lệnh pip) chỉ project đó dùng. Bạn tạo nó bằng python -m venv .venv, kích hoạt (activate) bằng một lệnh, cài package vào, và khi hỏng thì xóa thư mục rồi tạo lại. Nhờ vậy, project A dùng requests 2.34 còn project B vẫn giữ bản cũ mà không giẫm chân nhau.
Ngày 26/10/2026, mình làm trọn vòng đời này trên hai máy AIDev Cloud: Windows 10 với Python 3.15.1 cài từ python.org, và Ubuntu 24.04 với Python 3.12.3 có sẵn. Vài điều mình rút ra:
Trên Ubuntu 24.04 mới cài, lệnh
python3 -m venvbáo lỗi ngay vì máy thiếu gói hệ thốngpython3.12-venv.Trên Windows, tạo một môi trường ảo mất 8,83 giây (trung vị 5 lần), Ubuntu mất từ 2,36 đến 3,75 giây tùy bản Python. Phần lớn thời gian là để cài sẵn pip vào môi trường.
Khi đổi tên thư mục project, môi trường ảo hỏng mà không báo lỗi: chữ
(.venv)vẫn hiện nhưng lệnhpythonkhông còn trỏ vào.venv.
Vì sao cần môi trường ảo Python?
Khi bạn chạy pip install mà chưa có môi trường ảo, package được cài vào Python chung của cả máy. Hai project cần hai bản khác nhau của cùng một package sẽ xung đột với nhau, và bạn cũng không biết project của mình thật sự cần những gì để gửi cho người khác.
Trên máy Ubuntu, mình thấy rõ chuyện này: Python hệ thống đã có sẵn requests 2.31.0 do Ubuntu cài, còn trong môi trường ảo của project là requests 2.34.2, bản mới nhất trên PyPI (kho package chính thức của Python) tính đến ngày 08/11/2026. Cùng một lệnh import requests cho ra hai bản khác nhau tùy bạn đang ở trong hay ngoài môi trường ảo.

Ubuntu 24.04 còn chặn hẳn việc cài package vào Python hệ thống. Lệnh pip3 install requests bên ngoài môi trường ảo báo lỗi externally-managed-environment (theo PEP 668, một đề xuất chuẩn của Python; nguyên văn lỗi ở mục lỗi cuối bài). Chính thông báo lỗi đó khuyên bạn tạo môi trường ảo bằng python3 -m venv.
Tạo môi trường ảo Python trên Windows thế nào?
Máy Windows mình dùng ban đầu có sẵn Miniconda. Mình gỡ Miniconda để máy giống máy của người mới, rồi cài Python 3.15.1 từ python.org với ô "Add python.exe to PATH" được chọn. PATH là danh sách thư mục mà Windows tìm lệnh trong đó, nên có ô này thì gõ python ở đâu cũng chạy.
Mở Command Prompt (cmd), vào thư mục project rồi chạy lần lượt:
cd C:\du-an
python -m venv .venv
.venv\Scripts\activate
Dòng thứ hai tạo thư mục .venv. Dòng thứ ba kích hoạt môi trường ảo, tức là đưa .venv\Scripts lên đầu PATH để lệnh python và pip trỏ vào bản trong .venv. Dấu hiệu dễ thấy nhất là chữ (.venv) ở đầu dòng lệnh. Lệnh where python liệt kê các bản Python theo thứ tự Windows tìm, dòng đầu là bản sẽ chạy:

Thư mục .venv có sẵn một file .gitignore chứa dấu *. File này được venv tạo từ Python 3.13 để Git bỏ qua cả thư mục, đúng với khuyến cáo trong tài liệu venv là không đưa môi trường ảo lên Git. Bản Python 3.12 trên Ubuntu không tạo file này, nên ở đó bạn phải tự thêm .venv/ vào .gitignore của project.
Kích hoạt trong PowerShell bị báo "running scripts is disabled"
Nếu bạn dùng PowerShell (cửa sổ terminal mặc định của VS Code trên Windows), lệnh kích hoạt là .\.venv\Scripts\Activate.ps1. Theo tài liệu của Microsoft, chính sách chạy script (execution policy) mặc định trên Windows bản dùng cho máy cá nhân là Restricted, tức là không cho chạy file .ps1 nào. Máy AIDev Cloud mình thuê đặt sẵn RemoteSigned, nên mình đặt lại Restricted cho tài khoản đang dùng để tái hiện lỗi:

Cách sửa là lệnh dưới đây, cũng là lệnh tài liệu venv hướng dẫn. Lệnh này chỉ áp cho tài khoản của bạn và không cần quyền admin:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
RemoteSigned cho chạy script tạo trên máy của bạn, còn script tải từ Internet thì phải có chữ ký. Bạn không muốn đổi chính sách thì cứ dùng cmd với .venv\Scripts\activate, hoặc gọi thẳng .venv\Scripts\python mà không cần kích hoạt.
Trên Ubuntu và macOS, lệnh có khác không?
Khác ở đường dẫn và lệnh kích hoạt. Trên Linux và macOS, thư mục là bin thay cho Scripts, và bạn kích hoạt bằng source:
python3 -m venv .venv
source .venv/bin/activate
Trên Ubuntu 24.04 mới, lệnh đầu tiên báo lỗi ensurepip is not available (nguyên văn ở mục lỗi cuối bài). ensurepip là module cài pip vào môi trường mới, và Ubuntu tách module này ra gói hệ thống python3.12-venv mà máy chưa có. Mình chạy apt-get install -y python3.12-venv (mất 14,3 giây, cài cùng lúc với python3-pip), xóa thư mục .venv dở dang rồi tạo lại thì được:

Trên macOS, Python cài từ python.org hay Homebrew đều có sẵn venv, nên không gặp lỗi ensurepip như Ubuntu. Lần này mình chưa chạy thử trên macOS.
Cài package và xuất requirements.txt thế nào?
Khi đầu dòng đã có (.venv), lệnh pip install cài vào môi trường ảo. Sau đó pip freeze > requirements.txt ghi ra danh sách package kèm đúng phiên bản. File này là thứ bạn đưa lên Git hay gửi cho người khác, thay cho cả thư mục .venv:

Mình chép file requirements.txt vừa tạo trên Ubuntu sang máy Windows rồi cài lại bằng python -m pip install -r requirements.txt. Cả năm package được cài đúng phiên bản; riêng charset-normalizer được pip tải bản dựng cho Windows (win_amd64). Gõ python -m pip thay cho pip thì chắc chắn pip đang chạy bằng đúng bản Python mà lệnh python trỏ tới.

Bạn để ý dòng pip: môi trường ảo trên Windows có pip 26.2.2 đi kèm Python 3.15.1, còn trên Ubuntu là pip 24.0 đi kèm Python 3.12.3. Mỗi môi trường ảo lấy pip từ bản Python đã tạo ra nó.
Thoát và xóa môi trường ảo ra sao?
Gõ deactivate để thoát, chữ (.venv) biến mất và lệnh python (trên Ubuntu là python3) trở về bản toàn máy. Môi trường ảo không có lệnh xóa riêng: bạn xóa thư mục .venv là xong.
Việc | Windows (cmd) | Ubuntu, macOS |
|---|---|---|
Tạo |
|
|
Kích hoạt |
|
|
Kích hoạt (PowerShell) |
| |
Xem đang dùng Python nào |
|
|
Lưu danh sách package |
| như Windows |
Cài lại từ danh sách |
| như Windows |
Thoát |
|
|
Xóa |
|
|
Tài liệu Python coi môi trường ảo là thứ dùng xong có thể bỏ, nên xóa đi rồi tạo lại phải thật dễ. Trên Ubuntu, mình xóa .venv, tạo lại và cài từ requirements.txt, lệnh import requests lại ra 2.34.2 như cũ. Việc này chỉ cần bốn lệnh: xóa, tạo, kích hoạt và cài.
Đổi tên hay di chuyển thư mục project thì sao?
Môi trường ảo ghi cứng đường dẫn tuyệt đối lúc tạo. Mình đổi tên thư mục du-an thành du-an-moi rồi kích hoạt lại, và trên cả hai máy chữ (.venv) vẫn hiện như không có gì xảy ra. Trên Ubuntu, which python không ra gì, còn pip --version báo đang dùng pip của Python hệ thống:

Gọi thẳng .venv/bin/pip cũng không chạy, vì dòng đầu file pip vẫn trỏ về thư mục cũ:
$ .venv/bin/pip --version
bash: .venv/bin/pip: cannot execute: required file not found
$ head -1 .venv/bin/pip
#!/root/du-an/.venv/bin/python3
Trên Windows, where python sau khi kích hoạt chỉ ra Python toàn máy, và deactivate báo không tìm thấy lệnh vì file deactivate.bat nằm ở đường dẫn cũ. Lệnh .venv\Scripts\pip cũng hỏng: nó vẫn gọi python.exe ở thư mục cũ, nên thoát với mã lỗi 1 mà không làm được gì:

Cách sửa ở cả hai máy giống nhau: xóa .venv, tạo lại ở chỗ mới và cài từ requirements.txt. Đây cũng là lý do bạn nên cập nhật requirements.txt mỗi lần cài thêm package.
venv, virtualenv, uv khác nhau thế nào?
venv có sẵn trong Python từ bản 3.3, không cần cài gì thêm. virtualenv là package của PyPA (nhóm phát triển công cụ đóng gói Python) ra đời trước venv. Cụm "virtualenvs" hay gặp ở thư mục ~/.virtualenvs, nơi gom nhiều môi trường ảo vào một chỗ; tài liệu venv cũng nhắc tới cách tổ chức này. uv là công cụ quản lý package và môi trường của Astral, có lệnh uv venv.
Mình đo thời gian tạo một môi trường ảo trên cả hai máy, mỗi cách 5 lần xen kẽ nhau:

Cách tạo | Máy | Thời gian (trung vị) | Dung lượng | Có sẵn pip |
|---|---|---|---|---|
| Windows, Python 3.15.1 | 8,83 giây | 11,9 MB, 898 file | Có |
| Windows | 0,17 giây | 0,5 MB, 9 file | Không |
| Windows, uv 0.13.5 | 0,05 giây | 0,5 MB, 15 file | Không |
| Ubuntu, Python 3.12.3 | 3,75 giây | 16 MB, 1.010 file | Có |
| Ubuntu, Python 3.15.1 | 2,36 giây | 14 MB, 895 file | Có |
| Ubuntu, 21.14.13 | 0,32 giây | 6,9 MB, 495 file | Có |
| Ubuntu, uv 0.13.5 | 0,01 giây | 84 KB, 13 file | Không |
Bảng cho thấy gần như toàn bộ thời gian của venv là để cài pip vào môi trường: thêm --without-pip thì Windows chỉ còn 0,17 giây. Trên Windows, Microsoft Defender quét từng file mới tạo. Khi mình loại thư mục đo khỏi Defender, venv giảm từ 8,83 xuống 4,90 giây. Trên máy của bạn thì không nên làm vậy: chờ thêm vài giây mỗi lần tạo môi trường không đáng để bỏ một lớp bảo vệ.
uv nhanh hơn venv mặc định khoảng 180 đến 290 lần, một phần vì môi trường uv tạo không có pip; bạn cài package bằng uv pip install thay cho pip install. Với người mới học, mình vẫn khuyên dùng venv: có sẵn trong Python, hầu hết tài liệu và khóa học cho người mới đều dùng, và lỗi gặp phải thì dễ tìm cách sửa.
Lỗi thường gặp khi dùng môi trường ảo
externally-managed-environment khi pip install trên Ubuntu
$ pip3 install requests
error: externally-managed-environment
× This environment is externally managed
Nguyên nhân là Ubuntu 24.04 không cho pip ghi vào Python hệ thống. Bạn tạo môi trường ảo rồi cài trong đó. Thông báo lỗi có nhắc tới flag --break-system-packages, nhưng đừng dùng, vì flag này có thể làm hỏng các công cụ của Ubuntu viết bằng Python.
Đã cài package mà vẫn báo No module named
Lỗi này xảy ra khi bạn cài vào một bản Python còn code lại chạy bằng bản khác, ví dụ cài lúc chưa kích hoạt môi trường ảo. Bài sửa lỗi No module named pandas tái hiện lỗi này ở 6 chỗ trên Windows (cmd, VS Code, PyCharm, Jupyter, conda, Thonny) và cách sửa cho từng chỗ.
ensurepip is not available khi tạo môi trường ảo trên Ubuntu
$ python3 -m venv .venv
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt install python3.12-venv
Lỗi này do máy thiếu gói hệ thống chứa ensurepip. Bạn chạy sudo apt install python3.12-venv (đổi 3.12 theo bản Python của máy), xóa thư mục .venv dở dang rồi tạo lại.
running scripts is disabled khi kích hoạt trong PowerShell
Cách sửa đã ghi ở mục "Kích hoạt trong PowerShell": Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, hoặc chuyển sang cmd.
Khi nào không cần môi trường ảo?
Bạn học vài buổi đầu trong Thonny hay Google Colab thì chưa cần: Thonny dùng Python riêng của nó, còn Colab chạy trên máy tạm, package cài thêm mất khi phiên làm việc kết thúc. Một script nhỏ chỉ dùng thư viện chuẩn của Python (như math, csv, json) cũng không cần. Từ lúc bạn gõ pip install cho một project định giữ lâu, hãy tạo môi trường ảo Python cho project đó trước.
Câu hỏi thường gặp
Nên đặt tên thư mục là venv hay .venv?
Tên nào cũng chạy. Mình dùng .venv vì VS Code tự nhận ra thư mục này và chọn đúng interpreter (bản Python dùng để chạy code), như bài so sánh phần mềm lập trình Python đã chụp. Trên Linux và macOS, tên bắt đầu bằng dấu chấm còn được ẩn khỏi lệnh ls.
Làm sao biết đang ở trong môi trường ảo?
Nhìn chữ (.venv) ở đầu dòng lệnh là nhanh nhất, nhưng như mục đổi tên thư mục cho thấy, chữ này có thể hiện sai. Cách chắc hơn là chạy where python (Windows) hay which python (Linux, macOS) và xem dòng đầu có nằm trong .venv không.
Có nên đưa thư mục .venv lên Git không?
Không. Môi trường ảo gắn với đường dẫn và hệ điều hành của máy tạo ra nó. Bạn đưa requirements.txt lên Git, người khác tự tạo môi trường ảo và cài lại.
Môi trường ảo có tốn nhiều ổ đĩa không?
Môi trường trống chiếm 11,9 MB trên Windows và từ 14 đến 16 MB trên Ubuntu trong lần đo của mình. Phần nặng là package cài thêm, và mỗi project giữ một bản riêng. Ví dụ, thư mục venv của ComfyUI kèm PyTorch nặng 6,9 GB trong bài ComfyUI là gì.
Conda có thay được venv không?
Được, môi trường conda cũng là môi trường ảo, chỉ khác công cụ. Đừng trộn lẫn: đã dùng conda cho project nào thì cài package bằng conda install cho project đó, như bài về lỗi No module named pandas có giải thích.
Đọc tiếp
Học Python từ số 0: lộ trình 8 chặng từ cài đặt đến project đầu tiên.
Phần mềm lập trình Python: VS Code, PyCharm hay Thonny: chọn chỗ viết code, kèm số đo RAM và thời gian mở.
Download pandas và sửa lỗi No module named pandas: khi package đã cài mà Python vẫn không thấy.
Khóa Python từ số 0 trong lộ trình AI Engineer từ số 0 có bài riêng về môi trường ảo và requirements.txt, làm trên cả Windows lẫn macOS, trước khi bạn bắt đầu các project dùng pandas và các thư viện AI.
Mình chạy ngày 26/10/2026 trên hai máy AIDev Cloud: Windows 10 IoT Enterprise LTSC (build 19044), Xeon E5-2680 v4 8 luồng, 16 GB RAM, Python 3.15.1 từ python.org, pip 26.2.2; Ubuntu 24.04.4 LTS, Xeon E5-2696 v4, Python 3.12.3 (pip 24.0) và Python 3.15.1. Công cụ khác: uv 0.13.5, virtualenv 21.14.13, requests 2.34.2.
Chuyên mục
Học PythonTham vấn chuyên môn
Nhà sáng lập AIDev và VietPlatform · Thạc sĩ AI MSE
- Tốt nghiệp thủ khoa xuất sắc Thạc sĩ AI MSE.
- Đồng sáng lập, CTO E-University, SVOnline: số hóa 10+ đại học, 40.000+ sinh viên.
- Xây hệ thống AI cho doanh nghiệp tại VietPlatform.


