การใช้งาน Python Virtual Environment (venv)

อัปเดตล่าสุด 6 min read

Virtual Environment (venv) เป็นสิ่งที่แทบทุกคนต้องเจอเมื่อเริ่มต้นศึกษา Python หลายคนอาจจะยังไม่รู้ว่ามันคืออะไร สำคัญและประโยชน์ยังไง หรือแม้แต่จะใช้มันตอนไหน ? ในบทความนี้เราจะมาทำความเข้าใจเกี่ยวกับตัว Virtual Environment ในภาษาไพธอน พร้อมทั้งโครงสร้างและการใช้งาน ครบ จบในบทความเดียว


Virtual Environment (venv) คืออะไร?

Virtual Environment คือ คอนเซ็ปต์ของภาษาไพธอนในการจำลองสภาพแวดดล้อมที่จำเป็นในการรันโปรเจคท์ เช่น dependencies (โดย dependencies นี้จะหมายถึง packages, libraries, หรือแม้แต่ตัว Python Interpreter เอง) โดยให้เรามองว่า venv คือกล่องคอนเทนเนอร์ ๆ หนึ่ง เวลาเราติดตั้งไลบรารี่หรือแพ็คเกจต่าง ๆ ด้วยคำสั่ง pip install [PACKAGE-OR-LIBRARY_NAME] อะไรแบบนี้ตัวแพ็คเกจหรือไลบรารี่ก็จะถูกติดตั้งลงในกล่องนี้แทนที่จะถูกติดตั้งแบบ global  นั่นหมายความว่าในแต่ละโปรเจคท์ที่เราสร้างก็จะมี venv ของใครของมัน


ทำไม venv ถึงสำคัญ?

เวลาเราแชร์โปรเจคท์หรือนำไป deploy ก็จะง่ายต่อการจัดการ ไม่เกิดปัญหา เช่น ไลบรารี่ไม่ตรงกัน พอรันในเครื่องตัวเองรันได้ แต่พอแชร์ไปให้เพื่อนหรือนำไป deploy แล้วเวอร์ชั่นของ package หรือ library ไม่ตรงกันหรือไม่ compatible กัน เป็นต้น พูดง่าย ๆ venv จะช่วยจัดการ environment ให้เราไม่ต้องปวดหัวในภายหลัง

บทความแนะนำ: requirements.txt ไฟล์สำคัญที่ช่วยให้เรานำโปรเจคท์ Python ไปรันเครื่องอื่นได้ไม่มีปัญหา



ทำไมต้องใช้ venv?

สมมติเราพัฒนาโปรเจกต์หนึ่งในปีนี้และติดตั้ง

Django 5.x

แต่อีกโปรเจกต์เก่าของบริษัทอาจยังต้องใช้

Django 4.x

ถ้าเราติดตั้งทุกอย่างลง Python แบบ Global เราจะเริ่มเจอปัญหาเรื่อง Package Version, Dependency Conflict และ Environment ของแต่ละ Project ปะปนกัน

venv ช่วยให้แต่ละโปรเจกต์จัดการ Dependencies ของตัวเองได้

ประโยชน์หลักคือ

  • Project แต่ละตัวใช้ Package และ Version ต่างกันได้
  • ลดปัญหา Dependency Conflict
  • แชร์ Project ให้คนอื่น Setup ตามได้ง่ายขึ้น
  • Deployment และ CI/CD สามารถสร้าง Environment ใหม่จาก Dependency File ได้
  • ไม่ต้องติดตั้ง Package ทุกอย่างลง System Python

ปัจจุบันเรื่องนี้ยิ่งสำคัญขึ้น เพราะ Linux Distribution หลายตัวใช้มาตรฐาน Externally Managed Environment เพื่อป้องกัน pip ไปแก้ Package ของ System Python โดยตรง และจะแนะนำให้สร้าง Virtual Environment แทน


venv ไม่ใช่ Docker Container

ตรงนี้มักทำให้มือใหม่สับสนครับ venv ไม่ได้จำลอง Operating System ไม่ได้แยก Network, Process หรือ Filesystem แบบ Docker Container

สิ่งที่ venv ทำหลัก ๆ คือ แยก Python Interpreter Context และ Python Packages ของแต่ละ Environment ออกจากกัน

เมื่อเราสร้าง venv มันจะอ้างอิง Python ที่เราใช้สร้าง Environment พร้อมสร้าง Python executable, site-packages, activation scripts และไฟล์ configuration ของตัวเองขึ้นมา


สร้าง Virtual Environment

ก่อนที่จะสร้าง venv เราจำเป็นต้องสร้างโฟลเดอร์โปรเจคท์เราก่อนครับ จะสร้างไว้ใน Desktop หรือ Drive ไหนก็ได้ตามความเหมาะสมในการเก็บโปรเจคท์ จากนั้นให้เปิด Terminal (Mac/Linux) หรือ PowerShell/Command Prompt (Windows) ขึ้นมา

$ mkdir my_project
$ cd my_project


สร้าง venv (Windows)

$ python -m venv env


macOS/Linux


$ python3 -m venv env
Note: แพ็คเกจ  venv  นั้นจะถูกติดตั้งเป็น default มาให้แล้วสำหรับ Python เวอร์ชัน 3.3 ขึ้นไป ถึงจะสามารถใช้ได้ (ซึ่งตอนนี้ของเพื่อน ๆ ก็น่าจะเกิน v3.3 กันแล้วเนอะ) แต่ถ้าใครต่ำกว่า 3.3 ต้องใช้อีกตัวคือ virtualenv 


Activate Virtual Environment

เมื่อสร้าง venv เสร็จแล้ว ก็ต้องมีการ activate venv เพื่อเรียกใช้งานนั่นเอง

Activate venv สำหรับ Windows

$ env\Scripts\activate


Activate venv สำหรับ macOS/Linux

$ source env/bin/activate


เมื่อ activate สำเร็จจะได้


Windows

(env) PS C:Users\Son\my_project>


จะได้

.venv/ 
├── Scripts/ 
├── Lib/ 
└── pyvenv.cfg


WinmacOS/Linux

(env) sonny@MB-sonny my_project %

จะได้

.venv/
├── bin/
├── lib/
├── include/
└── pyvenv.cfg

เท่ากับว่าเราจะได้  (env) พร้อมใช้เรียบร้อย 


Deactivate Virtual Environment (ออกจาก venv)

เมื่อเรารู้วิธีการสร้างและ activate venv แล้ว ต่อมาก็ต้องรู้คำสั่งในการออกจาก venv หรือมักจะเรียกกันว่า  deactivate 

$ deactivate



เพียงเท่านี้ก็เป็นการออกจาก virtual environment แล้ว (สังเกตว่าเครื่องหมายวงเล็บจะหายไป)


ห้าม Push .venv ขึ้น Git

อีกเรื่องสำคัญคือ ไม่ควร Commit .venv เข้า Git

Virtual Environment ถูกออกแบบให้เป็นสิ่งที่ลบแล้วสร้างใหม่ได้ และ Python Documentation ระบุว่าไม่ควรนำ Environment Directory เข้า Source Control

ใน .gitignore ของ Project จึงควรมี

.venv/

แล้วเก็บเฉพาะ Source Code และข้อมูลสำหรับสร้าง Environment ใหม่ เช่น

my_project/
├── .gitignore
├── .venv/ # ไม่ Push ขึ้น Git
├── app.py
└── requirements.txt

ตั้งแต่ Python 3.13 เป็นต้นมา venv จะสร้าง .gitignore ภายใน Environment สำหรับ Git ให้อัตโนมัติด้วย แต่การใส่ .venv/ ไว้ใน .gitignore ของ Project เองก็ยังอ่านง่ายและรองรับ Project ที่ใช้ Python Version เก่ากว่าได้


Withoutcoffee Icantbedev

Withoutcoffee Icantbedev

ผู้ก่อตั้ง devhub.in.th ชอบออกแบบการเรียนและการสอนให้มีประสิทธิภาพมากที่สุด เชื่อว่าความรู้คือหนึ่งในสิ่งที่มีคุณค่ามากที่สุดและจะติดตัวเราไปในทุกที่ หลงไหลในการเดินทาง ธรรมชาติ อเมริกาโน่ การจิบเบียร์ และเป็นพ่อของแงว ๆ อยู่หลายตัว