ไฟล์. pyc สร้างขึ้นเมื่อใดก็ตามที่มีการนำเข้าองค์ประกอบรหัสที่เกี่ยวข้องและอัปเดตหากไฟล์รหัสที่เกี่ยวข้องได้รับการอัปเดต หากไฟล์. pyc ถูกลบไฟล์เหล่านั้นจะถูกสร้างใหม่โดยอัตโนมัติ อย่างไรก็ตามจะไม่ถูกลบโดยอัตโนมัติเมื่อไฟล์รหัสที่เกี่ยวข้องถูกลบ
สิ่งนี้อาจทำให้เกิดบั๊กที่สนุกมากระหว่างตัวอ้างอิงระดับไฟล์
ก่อนอื่นคุณสามารถลงเอยด้วยการกดรหัสที่ใช้งานได้กับเครื่องของคุณเท่านั้นและไม่มีใครอื่น หากคุณมีการอ้างอิงถึงไฟล์ที่คุณลบสิ่งเหล่านี้จะยังคงใช้งานได้ในเครื่องหากคุณไม่ได้ลบไฟล์. pyc ที่เกี่ยวข้องด้วยตนเองเนื่องจากไฟล์. pyc สามารถใช้ในการนำเข้าได้ สิ่งนี้ประกอบไปด้วยข้อเท็จจริงที่ว่าระบบควบคุมเวอร์ชันที่กำหนดค่าไว้อย่างเหมาะสมจะพุชไฟล์. py ไปยังที่เก็บส่วนกลางเท่านั้นไม่ใช่ไฟล์. pyc ซึ่งหมายความว่าโค้ดของคุณสามารถผ่าน "การทดสอบการนำเข้า" (นำเข้าทุกอย่างได้หรือไม่) ก็ใช้ได้ดีและไม่ ทำงานบนคอมพิวเตอร์ของใครก็ได้
ประการที่สองคุณสามารถมีจุดบกพร่องที่น่ากลัวได้หากคุณเปลี่ยนแพ็คเกจเป็นโมดูล เมื่อคุณแปลงแพ็กเกจ (โฟลเดอร์ที่มี__init__.py
ไฟล์) เป็นโมดูล (ไฟล์. py) ไฟล์. pyc ที่เคยเป็นตัวแทนของแพ็กเกจนั้นจะยังคงอยู่ โดยเฉพาะอย่างยิ่ง__init__.pyc
ซากศพ ดังนั้นหากคุณมีแพ็คเกจ foo ที่มีรหัสบางอย่างที่ไม่สำคัญให้ลบแพ็คเกจนั้นในภายหลังและสร้างไฟล์ foo.py ด้วยฟังก์ชันบางอย่างdef bar(): pass
และเรียกใช้:
from foo import bar
คุณได้รับ:
ImportError: cannot import name bar
เนื่องจาก python ยังคงใช้ไฟล์. pyc เก่าจากแพ็คเกจ foo ซึ่งไม่มีแถบกำหนดใดเลย ซึ่งอาจเป็นปัญหาโดยเฉพาะอย่างยิ่งบนเว็บเซิร์ฟเวอร์ซึ่งโค้ดที่ใช้งานได้ทั้งหมดอาจพังได้เนื่องจากไฟล์. pyc
จากสาเหตุทั้งสองนี้ (และอาจเป็นอื่น ๆ ) โค้ดการปรับใช้และโค้ดทดสอบของคุณควรลบไฟล์. pyc เช่นด้วย bash บรรทัดต่อไปนี้:
find . -name '*.pyc' -delete
นอกจากนี้ใน python 2.6 คุณสามารถรัน python ด้วย-B
แฟล็กเพื่อไม่ใช้ไฟล์. pyc ดูวิธีหลีกเลี่ยงไฟล์. pyc สำหรับรายละเอียดเพิ่มเติม
ดูเพิ่มเติม: ฉันจะลบไฟล์. pyc ทั้งหมดออกจากโปรเจ็กต์ได้อย่างไร
rm *.pyc
. pyc ด้วย. การดำเนินการนี้จะไม่ลบไฟล์. pyc ในโฟลเดอร์ที่ซ้อนกัน ใช้find . -name '*.pyc' -delete
แทน