Python – VENV

เข้าไปใน Project folder

Run คำสั่ง python -m venv .venv เพื่อสร้าง VENV ใน project folder ของเรา

# 1. สร้างโฟลเดอร์โปรเจกต์
mkdir my-project
cd my-project

# 2. สร้าง venv ขึ้นมาในนั้น
python -m venv .venv

Activate VENV โดยรันคำสั่งที่อยู่ใน .venv folder

.venv\Scripts\activate

แค่นั้น VENV ก็ทำงานแล้ว โดยดูได้จาก (venv) ที่แสดงขึ้นมาบน cmd prompt

หลังจากนั้นการทำงานจะทำงานภายใน .venv เท่านั้น เช่นการติดตั้ง library เพื่อใช้งานภายใน project ปัจจุบัน

Python venv คืออะไร?

venv (Virtual Environment) คือเครื่องมือมาตรฐานของ Python ที่ใช้สำหรับสร้าง “สภาพแวดล้อมเสมือน” ที่แยกตัวเป็นอิสระ (Isolated Environment) สำหรับโปรเจกต์ Python แต่ละโปรเจกต์

เปรียบเทียบง่ายๆ: ลองจินตนาการว่าคุณมีโปรเจกต์ 2 โปรเจกต์:

  • โปรเจกต์ A: เป็นเว็บแอปเก่าที่ต้องใช้ไลบรารี requests เวอร์ชั่น 2.20
  • โปรเจกต์ B: เป็นโปรเจกต์ Data Science ใหม่ล่าสุดที่ต้องใช้ requests เวอร์ชั่น 2.31 ซึ่งมีฟีเจอร์ใหม่ๆ

ถ้าคุณติดตั้งไลบรารีทั้งหมดลงในคอมพิวเตอร์โดยตรง (Global Installation) คุณจะเจอปัญหาทันที เพราะคุณสามารถมี requests ได้แค่เวอร์ชั่นเดียวเท่านั้น การอัปเดตเพื่อโปรเจกต์ B จะทำให้โปรเจกต์ A พัง และการลดเวอร์ชั่นเพื่อโปรเจกต์ A ก็จะทำให้โปรเจกต์ B ใช้งานไม่ได้

venv เข้ามาแก้ปัญหานี้โดยการสร้าง “กล่องเครื่องมือ” แยกสำหรับแต่ละโปรเจกต์ โปรเจกต์ A จะมีกล่องของตัวเองที่บรรจุ requests v2.20 ส่วนโปรเจกต์ B ก็จะมีกล่องอีกใบที่บรรจุ requests v2.31 ทำให้ทั้งสองโปรเจกต์ทำงานได้พร้อมกันในคอมพิวเตอร์เครื่องเดียวโดยไม่มีปัญหากระทบกัน

หลักการทำงานเป็นอย่างไร?

venv ไม่ได้ซับซ้อนอย่างที่คิด หลักการทำงานของมันคือ:

  1. การสร้าง (Creation): เมื่อคุณรันคำสั่ง python -m venv myenv
    • มันจะสร้างโฟลเดอร์ใหม่ขึ้นมา (ในที่นี้คือ myenv)
    • ภายในโฟลเดอร์นั้น มันจะทำการ คัดลอก (หรือสร้าง Symbolic Link) ของตัวแปรภาษา Python (Python Interpreter) ที่คุณใช้รันคำสั่งนี้มาไว้
    • มันจะสร้างโครงสร้างไดเรกทอรีที่จำเป็น เช่น Scripts (สำหรับ Windows) หรือ bin (สำหรับ macOS/Linux) และ Lib/site-packages
    • ที่สำคัญที่สุดคือ Lib/site-packages ที่สร้างขึ้นมาใหม่นี้จะ ว่างเปล่า มันคือที่ที่จะใช้เก็บไลบรารีสำหรับโปรเจกต์นี้โดยเฉพาะ
  2. การเปิดใช้งาน (Activation): เมื่อคุณรันสคริปต์ activate (เช่น myenv\Scripts\activate บน Windows)
    • สคริปต์นี้จะทำการ แก้ไขตัวแปรระบบ (Environment Variable) ที่ชื่อว่า PATH ของหน้าต่าง Command Prompt/Terminal ที่คุณใช้งานอยู่ ชั่วคราว
    • มันจะชี้ให้ PATH ค้นหาโปรแกรมต่างๆ (เช่น python, pip) จากโฟลเดอร์ myenv/Scripts (หรือ myenv/bin) ก่อน ที่จะไปหาจากที่อื่นในระบบ
    • ดังนั้น เมื่อคุณพิมพ์ pip install requests มันจะเรียกใช้ pip ที่อยู่ใน venv และติดตั้ง requests ลงใน myenv/Lib/site-packages ไม่ใช่ที่ติดตั้งหลักของ Python ในเครื่องคอมพิวเตอร์ของคุณ
    • คุณจะสังเกตเห็นว่าหน้า Command Prompt มี (myenv) นำหน้า เพื่อบอกว่าคุณกำลังทำงานอยู่ในสภาพแวดล้อมเสมือนนี้
  3. การปิดใช้งาน (Deactivation): เมื่อคุณพิมพ์คำสั่ง deactivate
    • มันจะทำการคืนค่า PATH กลับไปเป็นเหมือนเดิมก่อนที่คุณจะ Activate ทำให้ทุกอย่างกลับสู่สภาวะปกติ

ควรใช้งานในลักษณะไหน? (Best Practices)

นี่คือขั้นตอนและแนวทางปฏิบัติที่ดีที่สุด:

  1. หนึ่งโปรเจกต์ต่อหนึ่ง venv: กฎเหล็กคือ ทุกครั้งที่เริ่มโปรเจกต์ใหม่ ให้สร้าง venv ใหม่สำหรับโปรเจกต์นั้นเสมอ
  2. สร้าง venv ไว้ในโฟลเดอร์โปรเจกต์: เพื่อให้ง่ายต่อการจัดการ โดยมักจะตั้งชื่อว่า venv, .venv
    Bash
    # 1. สร้างโฟลเดอร์โปรเจกต์
    mkdir my-project
    cd my-project
    # 2. สร้าง venv ขึ้นมาในนั้น
    python -m venv .venv
  3. Activate venv ก่อนเริ่มทำงานเสมอ:
    • Windows:
      DOS
      .venv\Scripts\activate
    • macOS/Linux:
      Bash
      source .venv/bin/activate
  4. ติดตั้งไลบรารีที่ต้องการ:
    Bash
    pip install flask numpy pandas
  5. สร้างไฟล์ requirements.txt: ไฟล์นี้เปรียบเสมือน “ใบสั่งของ” ที่บอกว่าโปรเจกต์ของคุณต้องใช้ไลบรารีอะไรบ้าง และเวอร์ชั่นไหน เป็นสิ่งที่สำคัญมากสำหรับการทำงานร่วมกับผู้อื่นและการ Deploy
    Bash
    pip freeze > requirements.txt
    ไฟล์ requirements.txt จะมีหน้าตาประมาณนี้:
    flask==2.3.3
    numpy==1.26.0
    pandas==2.1.1
    ...
  6. เพิ่ม venv ลงใน .gitignore: คุณ ไม่ควร นำโฟลเดอร์ venv เข้าไปใน Git หรือส่งต่อไปให้คนอื่น เพราะมันมีขนาดใหญ่และอาจมีไฟล์ที่ผูกกับระบบปฏิบัติการของคุณโดยเฉพาะ ให้เพิ่มชื่อโฟลเดอร์ venv ของคุณลงในไฟล์ .gitignore
    # .gitignore
    .venv/