
Python 3.15 PEP 829: ไฟล์ .start แทน import ใน .pth
น้องกายEngineering
แพ็กเกจหลายตัวเคยวางไฟล์ .pth ใน site-packages เพื่อต่อ sys.path และรันโค้ดตอนเปิดอินเทอร์พรีเตอร์
PEP 829 ซึ่งสถานะ Final สำหรับ Python 3.15 แยกงานสองอย่างนี้ออกจากกันชัดขึ้น
ของเดิมที่น่ากังวล
.pth ทำได้สองอย่าง
- ต่อพาธเข้า
sys.path - บรรทัดขึ้นต้นด้วย
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 ปิดทั้งคู่
วิธีย้ายแพ็กเกจ
- ย้ายโค้ดเริ่มต้นไปเป็นฟังก์ชันไม่มีอาร์กิวเมนต์ในโมดูลที่ import ได้
- ใส่
pkg.mod:callableใน.start - ถ้าต้องรองรับ Python เก่าด้วย ให้ใช้รูปแบบ
import pkg.mod; pkg.mod.callable()ใน.pthตามคู่มือใน PEP แล้วค่อยลบเมื่อเลิก straddle
Recap
.startคือ entry point ตอนสตาร์ท ไม่ใช่execบรรทัด import อิสระ.pthยังใช้ขยาย path ได้- แพ็กเกจที่รันโค้ดตอนบูตควรวางแผนย้ายก่อนช่วงเตือน
- อ่าน PEP 829 ก่อนอัป 3.15 ใน CI