Khác với gói npm trong Node.js cho phép ta quản lý gói cho từng dự án một thì Python lại không có khả năng này. Việc này sẽ gây rắc rối nếu các dự án khác nhau yêu cầu các gói thư viện khác version nhau. Ngoài ra, đôi lúc ta cũng chẳng muốn cài các gói vào môi trường global làm gì cả mà chỉ muốn cài vào local sài xong là xoá đi luôn.

Thật may là với gói virtualenv ta có thể làm được các việc này. Cụ thể, gói này sẽ giúp ta tạo ra các môi trường Python riêng biệt cho từng dự án một. Nhờ đó mà ta có thể các đặt các gói riêng cho dự án đó mà không ảnh hưởng tới các dự án khác. Môi trường như vậy được gọi là môi trường ảo.

1. Cài đặt

Trước tiên ta cần cài đặt trình quản lý gói cho Python nếu chưa có:

$ sudo easy_install pip

Cài đặt gói virtualenv

$ pip install --upgrade virtualenv

2. Tạo môi trường ảo

Giả sử ta có dự án testvenv và muốn tạo môi trường ảo cho dự án này. Đầu tiền ta cần trỏ vào thư mục dự án:

$ cd [/PATH/TO/]testven

Sau đó chạy lệnh sau để tạo môi trường ảo:

$ virtualenv --system-site-packages .venv

Cụ thể hơn về các tham số của lệch virtualenv bạn có thể xem chi tiết với lệch sau:

$ virtualenv -h

3. Chạy môi trường ảo

Sau khi tạo được môi trường ảo rồi, ta có thể sử dụng nó như môi trường Python bình thường. Đương nhiên là trước khi có thể làm như vậy ta cần phải khởi động môi trường ảo đó. Sau khi nghịch chán rồi ta có thể tắt nó đi.

3.1. Bật

Muốn sài được môi trường ảo thì ta cần phải khởi động nó lên:

$ source .venv/bin/activate

3.2. Tắt

Muốn tắt đi, ta sài lệch sau:

$ deactivate

3.3. Cài gói

Nếu môi trườn ảo chưa có pip thì ta có thể cài đặt tương tự như môi trường thật:

$ easy_install -U pip

Có được pip rồi thì việc cài gói phần mềm trong môi trường ảo hệt như môi trường thật:

$ pip install YOUR_MODULE

Tương tự các thao tác xoá gói hay làm mọi trò với môi trường thật cũng có thể thực hiện trong môi trường ảo. Đương nhiên là các thao tác này chỉ ảnh hưởng tới môi trường ảo mà thôi.

3.4. Xuất gói

Việc xuất gói để đồng bộ môi trường với những thành viên khác trong đội dự án cũng được thực hiện tương tự như môi trường thật:

$ pip freeze -l > requirements.txt

Đương nhiên là việc cài đặt theo danh sách gói này cũng thế:

$ pip install -r requirements.txt

4. Vài vấn đề với venv

4.1. matplotlib

Rất có thể khi sài gói matplotlib ở môi trường ảo ta sẽ gặp lỗi:

$ python -c "import matplotlib.pyplot"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/haidm/HAI/mathplot/.venv/lib/python2.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/Users/haidm/HAI/mathplot/.venv/lib/python2.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/Users/haidm/HAI/mathplot/.venv/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.py", line 17, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

Đây là lỗi không nhận định được backend của matplotlib và để xử lý được lỗi này, ta có thể chỉ định tham số cho backend. Việc này được thực hiện bằng cách thêm file cấu hình matplotlibrc ở thư mục gốc của dự án với nội dung:

backend: TkAgg

5. Tổng kết

Phần này sẽ tóm gói lại các lệnh để tạo được môi trường ảo:

# Tạo môi trường ảo
$ virtualenv --system-site-packages .venv

# Khởi động môi trường ảo
$ source .venv/bin/activate

# Cài đặt gói
$ pip install -r requirements.txt

# Xuất gói
$ pip freeze -l > requirements.txt

# Tắt môi trường ảo
$ deactivate

Happy Virtual Env!