Hướng dẫn virtual environment python - python môi trường ảo

Hướng dẫn virtual environment python - python môi trường ảo

Đã đăng vào thg 9 28, 2015 5:57 SA 3 phút đọc 3 phút đọc

Virtual Environments là gì và dùng để làm gì?

Virtual Environment dịch nôm na là môi trường ảo Cũng giống như máy ảo (Virtual Machine), Virtual Environment thiết lập một môi trường ảo, cho phép bạn nghịch ngợm lung tung với các packages của Python mà không làm ảnh hưởng đến những packages đã được cài đặt sẵn trên Python. Ví dụ bạn muốn thử nghiệm với Django 1.8 trong khi trên hệ thống đang cài đặt Django 1.4 LTS. Cũng giống như việc bạn dùng Virtual Machine để thử nghiệm phiên bản Chrome beta mới nhất mà không muốn làm ảnh hưởng đến phiên bản đang có trên máy.

Hướng dẫn virtual environment python - python môi trường ảo
Cũng giống như máy ảo (Virtual Machine), Virtual Environment thiết lập một môi trường ảo, cho phép bạn nghịch ngợm lung tung với các packages của Python mà không làm ảnh hưởng đến những packages đã được cài đặt sẵn trên Python. Ví dụ bạn muốn thử nghiệm với Django 1.8 trong khi trên hệ thống đang cài đặt Django 1.4 LTS. Cũng giống như việc bạn dùng Virtual Machine để thử nghiệm phiên bản Chrome beta mới nhất mà không muốn làm ảnh hưởng đến phiên bản đang có trên máy.

Công cụ tạo ra Virtual Environment trên Python là virtualenv. virtualenv tạo ra một thư mục chứa tất cả những thứ cần thiết (executables, libraries).

Sử dụng Virtual Environment như thế nào? Trước hết để sử dụng được Virtual Environment thì bạn phải cài virtualenv cái đã.

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
2

Tạo Virtual Environment

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
3

virtualenv sẽ tạo ra một thư mục có tên là [project_name] chứa tất cả những gì cần thiết. Hãy thử xem nội dung của thư mục này:

  • ./lib
  • ./lib/python2.6
  • ./lib/python2.6/site-packages
  • ./lib/python2.6/distutils
  • ./include
  • ./bin

Nếu trên server có nhiều phiên bản Python (2.x, 3.x) bạn hoàn toàn có thể khởi tạo Virtual Environment với một phiên bản chỉ định:

virtualenv -p /usr/bin/python2.7 [project_name]

Hoặc bạn có thể tạo một Virtual Environment mà không có các packages đã được cài đặt sẵn (trong trường hợp bạn muốn làm mọi thứ từ đầu:

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
4

Sử dụng Virtual Environment

Khởi động Virtual Environment bằng câu lệnh:

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
5

Tên của Virtual Environment sẽ xuất hiện ở phía trước command prompt, cho ta thấy Python đang sử dụng Virtual Environment. Từ đây tất cả những packages được cài đặt mới sẽ nằm trong thư mục [project_name]

Thoát khỏi Virtual Environment

Sử dụng câu lệnh

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
6

Tìm hiểu về pyenv để thiết lập môi trường ảo nhanh chóng

Pyenv là cách để bạn thiết lập nhanh chóng giữa các môi trường ảo hoặc sử dụng các phiên bản python khác nhau. Nếu bạn từng sử dụng rbenv trong ruby thì pyenv cũng được fork từ rbenv.

Sau đây là các bước để cài đặt và sử dụng rbenv

Di chuyển đến vị trí muốn cài pyenv: thông thường

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
7

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
8

Xác định biến môi trường Pyenv_root

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
9

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
0

Add pyenv init vào shell

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
1

Restart shell của bạn

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
2

Cài môi trường phiên bản python bạn muốn sử dụng.VD 2.7.8

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
3

Bạn có thể cài nhiều phiên bản python. Set 1 phiên bản mặc định

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
4

Hoặc cục bộ ở 1 thư mục

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
5

All rights reserved

Là một lập trình viên chuyên nghiệp Python, việc sử dụng thành thạo môi trường lập trình "ảo" gần như là bắt buộc. Môi trường "ảo" trong Python được thiết lập như thế nào? Có những cách thiết lập ra làm sao ? Tại sao phải sử dụng virtual environments? Bài viết dưới đây sẽ đưa ra các luận điểm và đề mục cũng như cách giải thích đơn giản giúp các bạn có thể nhanh chóng tiếp cận với virtual environments.

Ghi chú: Tôi xin phép viết tắt VE thay cho từ Virtual environment và tạm dừng dịch nghĩa từ khóa trên sang tiếng Việt là môi trường "ảo" để có thể giữ nguyên ý nghĩa của từ khóa. Bài viết này được tôi thực hiện trên Windows vì các bài hướng dẫn về VE trên Linux đã hơi bị nhiều rồi. Và các user sử dụng Linux thì thuộc vào thành phần expert-user rồi nên chắc...không cần hướng dẫn nhiều họ cũng có thể làm được.
Bài viết này được tôi thực hiện trên Windows vì các bài hướng dẫn về VE trên Linux đã hơi bị nhiều rồi. Và các user sử dụng Linux thì thuộc vào thành phần expert-user rồi nên chắc...không cần hướng dẫn nhiều họ cũng có thể làm được.

1. Giới thiệu Virtual environment (VE) trong Python

Là một lập trình viên Python, bạn không thể chỉ làm mãi một dự án với một số library/module/framework được cài đặt thẳng vào thư viện gốc được. Bạn phải luôn sẵn sàng với việc đầu tuần code Flask-API trên nền tảng Python 3.6.x; giữa tuần thì sửa một web-application của Django trên nền tảng Python 3.7.x; cuối tuần bạn lại thấy Python 3.9.0 vừa mới release, bạn muốn test một số feature mới được công bố; à, còn chưa kể dự án Odoo10 đang nhận maintain và chạy trên nền tảng Python2.7 nữa chứ. Mỗi dự án lại có một loạt cái thư viện khác nhau, Dự án Flask A dùng thư viện Flask 0.12, dự án Flask B lại dùng thư viện Flask 1.02; hoặc như Django hiện tại có nhiều dự án chạy song song 2.2, 3.0, ....Bạn chỉ có một cái laptop mà với mỗi project như trên bạn không thể nào cài đặt chung hết trên thư mục cài đặt gốc của Python được. Chẳng nhẽ mỗi dự án lại cài một bản Python sang một thư mục khác nhau và thực hiện khởi tạo môi trường thông dịch một cách thủ công ?
Mỗi dự án lại có một loạt cái thư viện khác nhau, Dự án Flask A dùng thư viện Flask 0.12, dự án Flask B lại dùng thư viện Flask 1.02; hoặc như Django hiện tại có nhiều dự án chạy song song 2.2, 3.0, ....
Bạn chỉ có một cái laptop mà với mỗi project như trên bạn không thể nào cài đặt chung hết trên thư mục cài đặt gốc của Python được. Chẳng nhẽ mỗi dự án lại cài một bản Python sang một thư mục khác nhau và thực hiện khởi tạo môi trường thông dịch một cách thủ công ?

Sớm nắm bắt được nhu cầu của các lập trình viên, "ông chú Python" - Mr Guido và các cộng sự đã cho ra đời một công cụ "chất" để hỗ trợ các lập trình viên được khám phá thoải mái với Python là Virtual environment.

Virtual Environment dịch nôm na là môi trường ảo. Cũng giống như máy ảo (Virtual Machine), Virtual Environment thiết lập một môi trường ảo, cho phép bạn thoải mái thực hiện "vọc" (cài đặt rồi xóa, cài đặt các phiên bản khác nhau) lung tung với các packages của Python mà không sợ làm ảnh hưởng đến những dự án đang có sẵn.

Lợi ích của việc sử dụng VE.

Trên máy tính của tôi đang cài song song 3 phiên bản của Python là Python 2.7, 3.6, 3.8, 3.9. Do đặc thù của mỗi dự án lại sử dụng các package khác nhau nên mỗi dự án tôi sẽ tạo cho nó một VE. Tại mỗi VE, tôi thoải mái cài đặt các thư viện cần dùng mà không phải lo nghĩ đến việc cài thư viện này sẽ làm ảnh hưởng đến việc khởi chạy các dự án khác vì mỗi VE là một môi trường ảo hoàn toàn độc lập.

Ví dụ minh họa: 

Hướng dẫn virtual environment python - python môi trường ảo

Ngoài lợi ích trên, VE còn cung cấp chức năng cho phép export chính xác các package đang sử dụng trong VE (chính xác đến tận version bao nhiêu), file cấu hình môi trường này thường được đặt tên là requirements.txt).Với mỗi dự án, khi đẩy lên git hoặc các SVN khác, tôi sẽ cần gắn thêm file cấu hình môi trường ảo 'requirements.txt' này vào.Khi cần xây dựng VE cho dự án ở một môi trường làm việc khác, tôi sẽ thực hiện import file requirements.txt vào VE là được. Việc import vào cũng đơn giản như export vậy, hệ thống sẽ tự động thực hiện sắp xếp các thư viện theo thứ tự để thực hiện install vào VE.Thật là tiện lợi đúng không?
Với mỗi dự án, khi đẩy lên git hoặc các SVN khác, tôi sẽ cần gắn thêm file cấu hình môi trường ảo 'requirements.txt' này vào.
Khi cần xây dựng VE cho dự án ở một môi trường làm việc khác, tôi sẽ thực hiện import file requirements.txt vào VE là được. Việc import vào cũng đơn giản như export vậy, hệ thống sẽ tự động thực hiện sắp xếp các thư viện theo thứ tự để thực hiện install vào VE.
Thật là tiện lợi đúng không?

2. Cách xây dựng và sử dụng VE.

Theo thời gian và nhu cầu công việc, Python cung cấp nhiều cách thức để thực hiện tạo ra các VE, dưới đây, tôi sẽ giới thiệu với các bạn một số cách mà thường được các lập trình viên dùng nhiều.

2.1. Sử dụng công cụ virtualenv

Virtualenv gần như là một công cụ thường gặp nhất với các lập trình viên Python khi muốn thiết lập một VE (https://virtualenv.pypa.io/en/latest/)Trước khi muốn sử dụng nó thì chúng ta sẽ phải thực hiện install ra. Với terminal mặc định trên máy của bạn, bạn chỉ cần gõ dòng lệnh:  

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
6
Trước khi muốn sử dụng nó thì chúng ta sẽ phải thực hiện install ra. Với terminal mặc định trên máy của bạn, bạn chỉ cần gõ dòng lệnh:  
PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
6

Kết quả sẽ như dưới đây:

 PS C:\Users\quangvinh2986> pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/be/98/8c548c1b11391695c9de2660a289bedfb7c2784651e9f93449159ca8bf81/virtualenv-20.0.33-py2.py3-none-any.whl (4.9MB)
     |████████████████████████████████| 4.9MB 3.3MB/s
Collecting distlib<1,>=0.3.1 (from virtualenv)
  Downloading https://files.pythonhosted.org/packages/f5/0a/490fa011d699bb5a5f3a0cf57de82237f52a6db9d40f33c53b2736c9a1f9/distlib-0.3.1-py2.py3-none-any.whl (335kB)
     |████████████████████████████████| 337kB 1.1MB/s
Collecting filelock<4,>=3.0.0 (from virtualenv)
  Downloading https://files.pythonhosted.org/packages/93/83/71a2ee6158bb9f39a90c0dea1637f81d5eef866e188e1971a1b1ab01a35a/filelock-3.0.12-py3-none-any.whl
Requirement already satisfied: six<2,>=1.9.0 in c:\program files\python38\lib\site-packages (from virtualenv) (1.15.0)
Collecting appdirs<2,>=1.4.3 (from virtualenv)
  Downloading https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl
Installing collected packages: distlib, filelock, appdirs, virtualenv
Successfully installed appdirs-1.4.4 distlib-0.3.1 filelock-3.0.12 virtualenv-20.0.33

Sau khi cài đặt, thực hiện kiểm tra version của virtualenv

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py

Sau khi install thư viện, thực hiện di chuyển đến vị trí muốn đặt VE. Tại vị trí này, chúng ta thực hiện cài đặt VE, bằng câu lệnh: 

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
7 . Trong đó hr_api_django2_env là tên của VE mà chúng ta muốn đặt. Thông thường tôi có thói quen đặt tên theo project và framework chủ đạo hoặc package chủ đạo, với tiếp hậu ngữ là _env (đây là cách đặt tên để dễ nhớ với tôi, với các bạn thì tùy theo style của mỗi người). 

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env

Như vậy là chúng ta đã khởi tạo được VE cho dự án hr_api dự kiến sẽ sử dụng django2.

Chúng ta cùng xem bên trong thư mục VE có chứa những gì nhé.

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg

Bên trong thư mục VE có chứa 2 thư mục con Lib và Scripts, kèm 1 file config cho môi trường.

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages

Thư mục Lib có chứa thư mục site-packages, như vậy đây sẽ là nơi chứa các package mà chúng ta sẽ cài đặt vào VE.

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\site-packages\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib\site-packages


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                pip
d-----         10/9/2020   9:52 PM                pip-20.2.3.dist-info
d-----         10/9/2020   9:52 PM                pkg_resources
d-----         10/9/2020   9:52 PM                setuptools
d-----         10/9/2020   9:52 PM                setuptools-50.3.0.dist-info
d-----         10/9/2020   9:52 PM                wheel
d-----         10/9/2020   9:52 PM                wheel-0.35.1.dist-info
d-----         10/9/2020   9:52 PM                _distutils_hack
-a----         10/9/2020   9:52 PM            152 distutils-precedence.pth
-a----         10/9/2020   9:52 PM            126 easy_install.py
-a----         10/9/2020   9:52 PM              0 pip-20.2.3.virtualenv
-a----         10/9/2020   9:52 PM              0 setuptools-50.3.0.virtualenv
-a----         10/9/2020   9:52 PM              0 wheel-0.35.1.virtualenv
-a----         10/9/2020   9:52 PM             18 _virtualenv.pth
-a----         10/9/2020   9:52 PM           5792 _virtualenv.py

Hiện tại thì thư mục này trên VE đồng bộ với thư mục site-packages của Python3.8 trên máy của tôi (do tôi thường cài đặt package vào từng VE riêng biệt), nếu lỡ máy của bạn đã cài một số package sẵn rồi, bạn không muốn các VE sẽ kéo các package đó vào thì khi thực hiện khởi tạo VE, bạn thêm tham số

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
8 vào là được.

Ví dụ:

PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
9
PS E:\code_learn\VESamples> ls -l .\hr_api_django2_env\


    Directory: E:\code_learn\VESamples\hr_api_django2_env


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                Lib
d-----         10/9/2020   9:52 PM                Scripts
-a----         10/9/2020   9:52 PM             42 .gitignore
-a----         10/9/2020   9:52 PM            293 pyvenv.cfg
9

Tiếp tục khám phá xem thư mục Scripts có gì nhé.

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Scripts\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Scripts


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         10/9/2020   9:52 PM           2235 activate
-a----         10/9/2020   9:52 PM           1035 activate.bat
-a----         10/9/2020   9:52 PM           3085 activate.fish
-a----         10/9/2020   9:52 PM           1755 activate.ps1
-a----         10/9/2020   9:52 PM           1176 activate.xsh
-a----         10/9/2020   9:52 PM           1193 activate_this.py
-a----         10/9/2020   9:52 PM            510 deactivate.bat
-a----         10/9/2020   9:52 PM         106381 easy_install-3.8.exe
-a----         10/9/2020   9:52 PM         106381 easy_install.exe
-a----         10/9/2020   9:52 PM         106381 easy_install3.8.exe
-a----         10/9/2020   9:52 PM         106381 easy_install3.exe
-a---l         10/9/2020   9:52 PM              0 libcrypto-1_1.dll
-a---l         10/9/2020   9:52 PM              0 libffi-7.dll
-a---l         10/9/2020   9:52 PM              0 libssl-1_1.dll
-a----         10/9/2020   9:52 PM         106372 pip-3.8.exe
-a----         10/9/2020   9:52 PM         106372 pip.exe
-a----         10/9/2020   9:52 PM         106372 pip3.8.exe
-a----         10/9/2020   9:52 PM         106372 pip3.exe
-a----         10/9/2020   9:52 PM             24 pydoc.bat
-a---l         10/9/2020   9:52 PM              0 pyexpat.pyd
-a---l         10/9/2020   9:52 PM              0 python.exe
-a---l         10/9/2020   9:52 PM              0 python3.dll
......


Thì ra thư mục này chứa các file khởi chạy của Python như pip.exe, pip3.exe, python.exe,....Trong thư mục Scripts có 2 file quan trọng là activate.bat và deactivate.bat để thực hiện khởi chạy và tắt VE của bạn.
Trong thư mục Scripts có 2 file quan trọng là activate.bat và deactivate.bat để thực hiện khởi chạy và tắt VE của bạn.

Khởi chạy VE:Để khởi chạy VE, từ CMD, chúng ta gọi đến file activate.bat
Để khởi chạy VE, từ CMD, chúng ta gọi đến file activate.bat

E:\code_learn\VESamples\hr_api_django2_env>Scripts\activate.bat

(hr_api_django2_env) E:\code_learn\VESamples\hr_api_django2_env>

Sau khi thực hiện active thành công thì phía trên đầu của đường dẫn sẽ có tên của VE ở trong dấu (hr_api_django2_env)


Thực hiện install một package vào VE:Ví dụ tôi thực hiện install Django 2.2 vào VE này thì câu lệnh sẽ là:
Ví dụ tôi thực hiện install Django 2.2 vào VE này thì câu lệnh sẽ là:

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages
0

Phần này các bạn cần lưu ý: Nếu không có tham số =2.2.0 phía sau thì hệ thống sẽ tự động tìm thư viện release mới nhất trên pypi (The Python Package Index), tại thời điểm này thì Django mới nhất là phiên bản 3.1.2 (tháng 10/2020).

(hr_api_django2_env) E:\code_learn\VESamples\hr_api_django2_env>pip install django==2.2.0
Collecting django==2.2.0
  Downloading Django-2.2-py3-none-any.whl (7.4 MB)
     |████████████████████████████████| 7.4 MB 1.1 MB/s
Collecting sqlparse
  Downloading sqlparse-0.4.1-py3-none-any.whl (42 kB)
     |████████████████████████████████| 42 kB 1.7 MB/s
Collecting pytz
  Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB 3.3 MB/s
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2 pytz-2020.1 sqlparse-0.4.1

Sau khi cài đặt xong, chúng ta kiểm tra xem VE của chúng ta đã được cài đặt thành công gói django2.2.0 chưa bằng câu lệnh pip -- freeze (hoặc pip freeze):

(hr_api_django2_env) E:\code_learn\VESamples\hr_api_django2_env>pip -- freeze
Django==2.2
pytz==2020.1
sqlparse==0.4.1

Với kết quả hiển thị như trên thì VE của chúng ta đã có phiên bản Django2.2

Export thư viện

Để thực hiện export các package trong VE ra và để mang đến import trong các VE khác, chúng ta sẽ sử dụng syntax:

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages
1

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
0

File requirements.txt sẽ được tạo ra tại thư mục hiện tại mà chúng ta đang đứng. Mở file requirements.txt, chúng ta sẽ có nội dung:

Hướng dẫn virtual environment python - python môi trường ảo

Import các package vào VE

Giờ chúng ta sẽ xóa package Django2.2 sau đó thực hiện import lại vào VE bằng lệnh

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages
2

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
1

Như này là đã xóa thành công thư viện Django2.2 trong VE.

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
2

Khi thực hiện cài đặt các package từ file requirements.txt, nếu các package đã có trong VE, thì pip sẽ bỏ qua như ví dụ trên với package pytz==2020.1, sqlparse==0.4.1.

Ngắt khởi chạy VE.

Để ngắt VE, chúng ta thực hiện đứng từ một thư mục nào đó, gọi vào file Scripts\deactivate.bat

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
3

Do đã thoát khỏi VE nên dòng thông tin (hr_api_django2_env) ở đầu thư mục cũng biến mất.

Trước đây, tôi cũng thường xuyên sử dụng virtualenv do từ thời Python2.7 công cụ này gần như là mạnh nhất để xây dựng các VE. Nhược điểm của nó là phải cài đặt thêm gói package virtualenv, nếu máy tính của bạn có chứa nhiều phiên bản Python và bạn liên tục phải switch qua lại giữa các project thuộc các phiên bản khác nhau thì dùng virtualenv không phải là phương án tối ưu. Lý do:- Khi muốn cài đặt thư viện virtualenv, bạn sẽ phải di chuyển thư mục trên terminal đến đúng vị trí chứa pip của phiên bản Python bạn cần dùng để gọi lệnh pip install virtualenv.- Khi muốn tạo mới một VE mà không phải trên version Python mặc định, bạn cũng phải di chuyển đến vị trí chứa python.exe (với windows) và thực hiện gọi lệnh tạo VE.
- Khi muốn cài đặt thư viện virtualenv, bạn sẽ phải di chuyển thư mục trên terminal đến đúng vị trí chứa pip của phiên bản Python bạn cần dùng để gọi lệnh pip install virtualenv.
- Khi muốn tạo mới một VE mà không phải trên version Python mặc định, bạn cũng phải di chuyển đến vị trí chứa python.exe (với windows) và thực hiện gọi lệnh tạo VE.

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
4

Để tạo một VE, đứng từ thư mục chứa python.exe, gọi đến thư viện virtualenv với tham số -m và thông tin đường dẫn tuyệt đối và tên của VE muốn tạo

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
5

Phía bên thư mục chứa VE:

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
6

2.2. Sử dụng công cụ venv

Nắm được nhược điểm của việc sử dụng package

PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages
3, từ phiên bản Python3.5, đã có công cụ "chính chủ" tích hợp sẵn vào site-packages của Python, đó là công cụ
PS E:\code_learn\VESamples\hr_api_django2_env> ls -l .\Lib\


    Directory: E:\code_learn\VESamples\hr_api_django2_env\Lib


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                site-packages
4 (https://docs.python.org/3/library/venv.html). Các lập trình viên Python không cần phải cài đặt thêm package nào khác cũng có thể nhanh chóng tạo ra các VE.Tuy nhiên một số máy tính do cài đặt bản Python-minimal nên bị thiếu thư viện, nếu bị thiếu thì cần cài bổ sung package: python3-venv (thường gặp trên máy cài hệ điều hành Linux)
Tuy nhiên một số máy tính do cài đặt bản Python-minimal nên bị thiếu thư viện, nếu bị thiếu thì cần cài bổ sung package: python3-venv (thường gặp trên máy cài hệ điều hành Linux)

Khởi tạo VE

Với bản Python mặc định trên máy tính, chỉ cần gọi lệnh python -m venv path_to_VE

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
7

Với bản Python khác với bản mặc định, các làm tương tự như dùng thư viện virtualenv, chỉ khác là bạn sẽ không cần cài đặt package trước khi sử dụng.

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
8

Sau câu lệnh tạo ra môi trường, không có phản hồi gì có nghĩ là đã tạo thành công nhé. Tại thư mục chứa VE: 

virtualenv 20.0.33 from c:\program files\python38\lib\site-packages\virtualenv\__init__.py
9

3. Một số lưu ý.

Phía trên tôi đã giới thiệu với các bạn các thông tin về VE và 2 phương pháp khởi tạo môi trường ảo. Phần tiếp theo đây, tôi sẽ giới thiệu với các bạn một số thông tin bổ sung cần lưu ý.

3.1. Lệnh khởi tạo và ngắt VE trên Linux/MacOS.

Trên Windows, các bạn sẽ gọi vào file activate.bat/deactivate.bat để khởi chạy và ngắt VE. Trên Lunix/MacOS, để do thư viện và môi trường khác nên việc cài đặt VE, khởi chạy VE dùng lệnh source bin/activate.

Ví dụ: Tôi sử dụng Ubuntu-WSL trên máy của tôi để demo nhé. 

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
0

Để ngắt khỏi VE:

PS C:\Users\quangvinh2986> E:
PS E:\> cd E:\code_learn\VESamples
PS E:\code_learn\VESamples> virtualenv hr_api_django2_env
created virtual environment CPython3.8.2.final.0-64 in 6161ms
  creator CPython3Windows(dest=E:\code_learn\VESamples\hr_api_django2_env, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\quangvinh2986\AppData\Local\pypa\virtualenv)
    added seed packages: pip==20.2.3, setuptools==50.3.0, wheel==0.35.1
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
PS E:\code_learn\VESamples> ls


    Directory: E:\code_learn\VESamples


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         10/9/2020   9:52 PM                hr_api_django2_env
1

Chỉ khác nhau về việc khởi chạy và ngắt VE, các action khác như export/import thì trên Windows và Linux/MacOS như nhau.

3.2. Sử dụng IDE Pycharm để khởi tạo VE.

Nếu bạn thường xuyên sử dụng Pycharm như một IDE chuyên dụng cho việc code các dự án Python, để bắt đầu mỗi dự án chúng ta đều phải khởi tạo VE trước.Các bạn có thể tham khảo hướng dẫn khá chi tiết về việc này tại trang support của Pycharm: https://www.jetbrains.com/help/pycharm/configuring-local-python-interpreters.html
Các bạn có thể tham khảo hướng dẫn khá chi tiết về việc này tại trang support của Pycharm: https://www.jetbrains.com/help/pycharm/configuring-local-python-interpreters.html

3.3. Không add/commit/push môi trường lên git.

Lưu ý cuối cùng tôi muốn trao đổi với các bạn là đừng bao giờ thực hiện đưa VE lên git/svn vì dung lượng của nó hơi bị ... nặng. Mặc dù trong thư mục VE đã có sẵn file .gitignore nhưng chúng ta vẫn cần lưu ý vấn đề này nhé.Để đồng bộ được các package/framework giữa các môi trường làm việc DEVs/UAT/PRODUCTION, chúng ta chỉ việc export các package trong môi trường ra file requirements.txt và ở môi trường làm việc mới sẽ thực hiện import chúng lại.
Để đồng bộ được các package/framework giữa các môi trường làm việc DEVs/UAT/PRODUCTION, chúng ta chỉ việc export các package trong môi trường ra file requirements.txt và ở môi trường làm việc mới sẽ thực hiện import chúng lại.

Kết:

Trên đây, tôi đã giới thiệu với các bạn lợi ích và cách sử dụng virtual environments trong lập trình Python chuyên nghiệp. Để đảm bảo tính đầy đủ của bài viết nên bài viết khá dài, hy vọng các bạn nhớ thực hiện setup các VE cho mỗi project để mỗi lần chúng ta "vọc vạch" các thư viện/package mới không làm ảnh hưởng đến những gì đang hoạt động ổn đinh. Cảm ơn các bạn đã đọc bài viết.
Cảm ơn các bạn đã đọc bài viết.