นากกายสีมิ้นต์ย้ายการ์ดจากกองไฟล์ .pth ไปกองไฟล์ .start บนโต๊ะมิ้นต์

Python 3.15 PEP 829: ไฟล์ .start แทน import ใน .pth

น้องกายEngineering

แพ็กเกจหลายตัวเคยวางไฟล์ .pth ใน site-packages เพื่อต่อ sys.path และรันโค้ดตอนเปิดอินเทอร์พรีเตอร์

PEP 829 ซึ่งสถานะ Final สำหรับ Python 3.15 แยกงานสองอย่างนี้ออกจากกันชัดขึ้น

ของเดิมที่น่ากังวล

.pth ทำได้สองอย่าง

  1. ต่อพาธเข้า sys.path
  2. บรรทัดขึ้นต้นด้วย import ถูกส่งเข้า exec() ตอนสตาร์ท

อันที่สองกว้างมาก เพราะต่อด้วย ; แล้วรันคำสั่งอื่นบนบรรทัดเดียวกันได้ ตรวจสอบยากและเปิดพื้นผิวโจมตีตอนบูต

สิ่งที่ PEP เปลี่ยน

  • คง .pth สำหรับขยาย sys.path
  • เพิ่ม .start ที่ระบุ entry point รูปแบบ pkg.mod:callable เท่านั้น
  • ถ้ามี .start จับคู่กับ .pth เดียวกัน ระหว่างช่วง deprecate จะไม่รันบรรทัด import ของ .pth นั้น

ไทม์ไลน์โดยสรุปจาก PEP

  • ปีแรกๆ (คาด 3.15–3.17): ยังประมวลผล import ใน .pth ได้ ยกเว้นเมื่อมี .start จับคู่
  • ช่วงถัดไป (คาด 3.18–3.19): เงียบๆ ไม่รันบรรทัด import
  • หลังนั้น: เตือนเมื่อยังมีบรรทัด import ค้าง

ไฟล์ทั้งสองประมวลผลผ่าน site.py ดังนั้น -S ปิดทั้งคู่

วิธีย้ายแพ็กเกจ

  1. ย้ายโค้ดเริ่มต้นไปเป็นฟังก์ชันไม่มีอาร์กิวเมนต์ในโมดูลที่ import ได้
  2. ใส่ pkg.mod:callable ใน .start
  3. ถ้าต้องรองรับ Python เก่าด้วย ให้ใช้รูปแบบ import pkg.mod; pkg.mod.callable() ใน .pth ตามคู่มือใน PEP แล้วค่อยลบเมื่อเลิก straddle

Recap

  • .start คือ entry point ตอนสตาร์ท ไม่ใช่ exec บรรทัด import อิสระ
  • .pth ยังใช้ขยาย path ได้
  • แพ็กเกจที่รันโค้ดตอนบูตควรวางแผนย้ายก่อนช่วงเตือน
  • อ่าน PEP 829 ก่อนอัป 3.15 ใน CI