ข้ามไปยังเนื้อหา

Virtual Environments & pip

ทุกโปรเจกต์ Python ควรรันอยู่ภายใน virtual environment ของตัวเอง หากไม่มี ทุกคำสั่ง pip install จะติดตั้งไปยัง Python installation ระดับ global ซึ่งแพ็กเกจจากโปรเจกต์ต่าง ๆ จะชนกันและความขัดแย้งของเวอร์ชันจะสะสมอย่างเงียบ ๆ Virtual environment คือไดเรกทอรีต้นไม้ที่มี Python interpreter และ site-packages ของตัวเอง แยกออกจาก Python ของระบบและจากทุกโปรเจกต์อื่น ๆ อย่างสมบูรณ์

Python มีโมดูล venv ใน standard library ข้อตกลงคือตั้งชื่อ environment ว่า .venv และวางไว้ที่ root ของโปรเจกต์

Terminal window
# create a virtual environment in .venv/
python -m venv .venv

หลังจากสร้างแล้ว environment จะยังไม่ทำงาน การ activate จะเพิ่ม .venv/bin (หรือ .venv\Scripts บน Windows) ไว้ต้น PATH ของคุณ เพื่อให้ python และ pip ชี้ไปยังสำเนาที่แยกออกมา

Terminal window
# activate — macOS / Linux
source .venv/bin/activate
# activate — Windows (PowerShell)
.venv\Scripts\Activate.ps1
# you should now see (.venv) in your prompt

เมื่อ environment ทำงานอยู่ pip จะติดตั้งไปยัง .venv/lib/ แทนที่ site-packages ระดับ global

Terminal window
# install a single package
pip install requests
# install a specific version
pip install "requests==2.31.0"
# install from requirements.txt
pip install -r requirements.txt

pip freeze จะพิมพ์แพ็กเกจที่ติดตั้งทุกตัวและเวอร์ชันที่ชัดเจน เปลี่ยนทิศทาง output ไปยัง requirements.txt เพื่อให้ผู้ร่วมทีมและ CI สามารถสร้าง environment เดียวกันได้

Terminal window
# write all installed packages + versions to requirements.txt
pip freeze > requirements.txt
# example output in requirements.txt:
# certifi==2024.2.2
# charset-normalizer==3.3.2
# idna==3.7
# requests==2.31.0
# urllib3==2.2.1

เมื่อทำงานในโปรเจกต์เสร็จแล้ว deactivate จะคืนค่า PATH เดิมของคุณ

Terminal window
deactivate

โปรเจกต์ Python ตามมาตรฐานจะเก็บ virtual environment ไว้ที่ root ควบคู่กับ source, tests และไฟล์ dependencies

flowchart TD
  root["project root"] --> venv[".venv/ (never commit — add to .gitignore)"]
  root --> src["src/"]
  src --> myapp["myapp/"]
  root --> tests["tests/"]
  root --> reqs["requirements.txt"]
  root --> pyproj["pyproject.toml"]
Typical Python project layout
คำสั่งใดที่สร้าง virtual environment ชื่อ .venv?
`pip freeze > requirements.txt` ทำอะไร?
ทำไม .venv/ ควรอยู่ใน .gitignore?