Virtual Environments & pip
ทุกโปรเจกต์ Python ควรรันอยู่ภายใน virtual environment ของตัวเอง หากไม่มี ทุกคำสั่ง pip install จะติดตั้งไปยัง Python installation ระดับ global ซึ่งแพ็กเกจจากโปรเจกต์ต่าง ๆ จะชนกันและความขัดแย้งของเวอร์ชันจะสะสมอย่างเงียบ ๆ Virtual environment คือไดเรกทอรีต้นไม้ที่มี Python interpreter และ site-packages ของตัวเอง แยกออกจาก Python ของระบบและจากทุกโปรเจกต์อื่น ๆ อย่างสมบูรณ์
การสร้าง virtual environment
หัวข้อที่มีชื่อว่า “การสร้าง virtual environment”Python มีโมดูล venv ใน standard library ข้อตกลงคือตั้งชื่อ environment ว่า .venv และวางไว้ที่ root ของโปรเจกต์
# create a virtual environment in .venv/python -m venv .venvการเปิดใช้งาน environment
หัวข้อที่มีชื่อว่า “การเปิดใช้งาน environment”หลังจากสร้างแล้ว environment จะยังไม่ทำงาน การ activate จะเพิ่ม .venv/bin (หรือ .venv\Scripts บน Windows) ไว้ต้น PATH ของคุณ เพื่อให้ python และ pip ชี้ไปยังสำเนาที่แยกออกมา
# activate — macOS / Linuxsource .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
# install a single packagepip install requests
# install a specific versionpip install "requests==2.31.0"
# install from requirements.txtpip install -r requirements.txtการกำหนดเวอร์ชัน dependencies
หัวข้อที่มีชื่อว่า “การกำหนดเวอร์ชัน dependencies”pip freeze จะพิมพ์แพ็กเกจที่ติดตั้งทุกตัวและเวอร์ชันที่ชัดเจน เปลี่ยนทิศทาง output ไปยัง requirements.txt เพื่อให้ผู้ร่วมทีมและ CI สามารถสร้าง environment เดียวกันได้
# write all installed packages + versions to requirements.txtpip 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 เดิมของคุณ
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"]