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

Virtual Envs, pip, uv และ Poetry

การจัดการ package คือจุดที่ประวัติศาสตร์ tooling ของ Python ปรากฏชัดเจนที่สุด Node มี model เดียว: npm ติดตั้งลงใน node_modules, package.json ประกาศ dependencies และ package-lock.json lock versions ที่แน่นอน Python มีสามชั้นที่คุณต้องเข้าใจ: ตัว interpreter เอง, ชั้น isolation (venv) และจากนั้น package manager ด้านบน

รันในเทอร์มินัลของคุณ:

Terminal window
# Create a virtual environment in the .venv folder
python3 -m venv .venv
# Activate it — you must do this every new terminal session
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate.bat # Windows CMD
# .venv\Scripts\Activate.ps1 # Windows PowerShell
# Confirm which python is active
which python # should point to .venv/bin/python
# Deactivate
deactivate

เมื่อ activate แล้ว pip install X จะติดตั้งลงใน .venv เท่านั้น เพิ่ม .venv/ ลงใน .gitignore ของคุณ

TypeScript
# npm classic workflow
npm install express # เพิ่มใน package.json + node_modules
npm install -D jest # dev dependency
npm install # ติดตั้งจาก package.json
npm ci # clean install จาก lock file (CI)
# package.json excerpt:
# {
# "dependencies": { "express": "^4.18.2" },
# "devDependencies": { "jest": "^29.0.0" }
# }
Python
# pip classic workflow
pip install requests # ติดตั้งลงใน active venv
pip install pytest --upgrade # ติดตั้ง/upgrade dev dep
pip freeze > requirements.txt # snapshot versions ทั้งหมดที่ติดตั้ง
pip install -r requirements.txt # reproduce จาก snapshot
# requirements.txt excerpt:
# requests==2.31.0
# certifi==2024.2.2
# charset-normalizer==3.3.2

requirements.txt เป็นวิธีที่เก่าแก่ที่สุด ใช้งานได้ แต่ไม่มีการแยกแยะระหว่าง direct และ transitive dependencies การแทนที่สมัยใหม่คือ pyproject.toml

uv (จาก Astral ทีมเดียวกับ ruff) เป็นตัวแทนของ pip และ venv รวมกัน เขียนด้วย Rust เร็วกว่า pip 10–100 เท่า จัดการ virtual environment ให้อัตโนมัติ และติดตั้งตัว interpreter ได้ด้วย จึงเป็นตัวเลือกแรกสำหรับโปรเจกต์ใหม่ อ่าน layer 1 และ 2 เพื่อเข้าใจว่ามันทำอะไรให้ แล้วใช้งานจริงที่ layer 3

Terminal window
# Install uv (once, globally)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create a new project (generates pyproject.toml + .venv)
uv init my-project
cd my-project
# Add a dependency (updates pyproject.toml + uv.lock)
uv add fastapi
# Add a dev dependency
uv add --dev pytest ruff mypy
# Sync environment from pyproject.toml (like npm ci)
uv sync
# Run a command inside the venv without activating
uv run python main.py
uv run pytest
# uv manages interpreters as well — no pyenv needed
uv python install 3.14
uv python pin 3.14 # writes .python-version
# Refresh the lock file without installing (like npm install --package-lock-only)
uv lock

Poetry คือ tool ตัวแรกที่รวม project metadata, dependency resolution และการจัดการ virtual environment ไว้ใน CLI เดียวที่ใช้งานลื่นมือ ทุกวันนี้ยังมีโปรเจกต์เดิมจำนวนมากใช้อยู่

TypeScript
# npm-like workflow
npm init # scaffold package.json
npm install express # เพิ่ม runtime dep
npm install -D jest # เพิ่ม dev dep
npm run start # รัน script
npm run test # รัน tests
cat package-lock.json # lock file ที่แน่นอน
Python
# Poetry — npm-like workflow สำหรับ Python
poetry new my-project # scaffold pyproject.toml + src/
poetry add fastapi # เพิ่ม runtime dep
poetry add --group dev pytest # เพิ่ม dev dep
poetry run python main.py # รัน script
poetry run pytest # รัน tests
cat poetry.lock # lock file ที่แน่นอน
pip + venvpoetryuv
ความเร็วช้ากลางเร็วมาก
Lock filerequirements.txt (manual)poetry.lockuv.lock
pyproject.tomlบางส่วนเต็มรูปแบบเต็มรูปแบบ
Auto-manage venvmanualใช่ใช่
ติดตั้ง interpreterไม่ได้ไม่ได้ได้ (uv python install)
ความสมบูรณ์เสถียรมากเสถียร (2.x)เสถียร ใช้กันแพร่หลาย
คำแนะนำlegacy projectsprojects ที่ใช้ poetry อยู่แล้วprojects ใหม่

Playground note: Package managers แก้ไข filesystem และ network — ต้องใช้ terminal รันคำสั่งข้างต้นในไดเรกทอรี project ของคุณ

อะไรคือคู่เทียบ Python ของการ isolate node_modules ต่อ project ของ npm?
คำสั่งใดสร้าง virtual environment ในไดเรกทอรี .venv?
อะไรคือคู่เทียบ uv ของ "npm ci" — ติดตั้งจาก lockfile อย่างแม่นยำ?
ไฟล์สมัยใหม่ตัวใดแทนที่ requirements.txt เป็น dependency manifest ของ project?