Kodokon kodokon.com

สภาพแวดล้อมเสมือน pip และโปรเจกต์ที่สะอาด

แยกแต่ละโปรเจกต์ไว้ใน venv ของตัวเอง ตรึงเวอร์ชันของดีเพนเดนซี และใช้โครงสร้างโปรเจกต์ที่สร้างซ้ำได้

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

การติดตั้งดีเพนเดนซีของทุกโปรเจกต์ไว้ในอินเทอร์พรีเตอร์ตัวเดียวกันนำไปสู่ความขัดแย้งของเวอร์ชันโดยตรง: โปรเจกต์ A ต้องการ requests 2.31 ส่วนโปรเจกต์ B ต้องการเวอร์ชันที่เข้ากันไม่ได้ สภาพแวดล้อมเสมือน (venv) แยกแต่ละโปรเจกต์ออกจากกัน: อินเทอร์พรีเตอร์ของมันเอง pip ของมันเอง แพ็กเกจของมันเอง นี่คือแนวปฏิบัติแบบมืออาชีพที่ต่อรองไม่ได้ - หนึ่งโปรเจกต์ หนึ่งสภาพแวดล้อม ที่สร้างขึ้นใหม่ให้เหมือนเดิมได้บนเครื่องใด ๆ

BASH
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip list
สร้าง เปิดใช้งาน และเติมแพ็กเกจให้สภาพแวดล้อมเสมือน

เพื่อให้การติดตั้งสร้างซ้ำได้ จงตรึงเวอร์ชันเอาไว้ pip freeze ส่งออกสภาพแวดล้อม ทั้งหมด รวมถึงดีเพนเดนซีทางอ้อม พร้อมเวอร์ชันที่แน่นอน: สร้างซ้ำได้สูงสุด แต่อัปเดตลำบาก แนวทางสมัยใหม่แยกสองความต้องการนี้ออกจากกัน: ดีเพนเดนซีโดยตรงประกาศไว้ใน pyproject.toml ด้วยข้อจำกัดที่หลวม ๆ และไฟล์ล็อกถูกสร้างขึ้นสำหรับการติดตั้งที่แน่นอน ในระดับของโปรเจกต์เล็ก ๆ requirements.txt ยังคงเป็นทางเลือกที่น่านับถืออย่างยิ่ง

BASH
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
ตรึงเวอร์ชัน แล้วสร้างสภาพแวดล้อมขึ้นใหม่ให้เหมือนเดิม

ในด้านโครงสร้าง src layout คือมาตรฐานอ้างอิง: โค้ดอยู่ใน src/<package>/ เทสต์อยู่ใน tests/ และการตั้งค่าอยู่ใน pyproject.toml จุดประสงค์ของโฟลเดอร์ src ไม่ใช่เรื่องความสวยงาม: มันป้องกันการเผลออิมพอร์ตแพ็กเกจในเครื่องจากไดเรกทอรีปัจจุบัน ซึ่งจะไปบดบังข้อผิดพลาดของการทำแพ็กเกจ - เทสต์ของคุณจะรันกับแพ็กเกจที่ถูกติดตั้งจริง ระหว่างการพัฒนา pip install -e . จะติดตั้งโปรเจกต์ในโหมดแก้ไขได้ (editable)

BASH
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore
โครงกระดูกของโปรเจกต์ในแบบ src layout

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. สภาพแวดล้อมเสมือนรับประกันอะไร?
    • การรันโค้ด Python ที่เร็วขึ้น
    • ดีเพนเดนซีที่แยกจากกันสำหรับแต่ละโปรเจกต์
    • ความเข้ากันได้ระหว่างเวอร์ชันต่าง ๆ ของ Python
    • การเข้ารหัสแพ็กเกจที่ติดตั้งไว้
  2. requirements.txt ที่สร้างโดย pip freeze มีอะไรอยู่ข้างใน?
    • เฉพาะดีเพนเดนซีโดยตรงของคุณเท่านั้น
    • ดีเพนเดนซีที่ติดตั้งไว้ทั้งหมด รวมถึงเวอร์ชันที่แน่นอน
    • รายการแพ็กเกจที่มีอยู่บน PyPI
  3. ทำไมจึงควรเลือก python -m pip install แทน pip install?
    • มันเป็นไวยากรณ์เดียวที่ยอมรับได้ภายใน venv
    • คำสั่งนี้เล็งไปที่ pip ของอินเทอร์พรีเตอร์ที่กำลังเปิดใช้งานอยู่
    • การติดตั้งเร็วกว่า