จะเกิดอะไรขึ้นถ้าฉันแก้ไขสคริปต์ Python ในขณะที่ทำงานอยู่


219

ลองนึกภาพสคริปต์ไพ ธ อนที่จะใช้เวลานานในการรันจะเกิดอะไรขึ้นถ้าฉันแก้ไขมันในขณะที่มันกำลังทำงานอยู่? ผลลัพธ์จะแตกต่างกันอย่างไร


8
โปรแกรมถูกโหลดลงในหน่วยความจำหลักของคุณ หากคุณเปลี่ยนไฟล์ต้นฉบับจะไม่มีอะไรเกิดขึ้น ลองนึกภาพของ CPU จะอ่านคำแนะนำจากฮาร์ดไดรฟ์ ...
เฟลิกซ์แพรว

15
@ Felix: เรียกว่า "Execute-in-Place" (XIP)
Ignacio Vazquez-Abrams

@Ignacio: น่าสนใจฉันไม่รู้ ขอบคุณ :)
เฟลิกซ์คลิง

3
คุณสามารถโหลดรหัสของโมดูลใหม่ได้แบบไดนามิกดูstackoverflow.com/questions/437589/…
Iliyan Bobev

2
โปรดทราบว่าไฟล์แบตช์ของ Windows จะทำงานในสถานที่ดังนั้นนี่ไม่ใช่คำถามสมมุติมีภาษาออกมีที่ทำงานด้วยวิธีนี้
yoyo

คำตอบ:


259

ไม่มีอะไรเพราะ Python รวบรวมสคริปต์ของคุณไว้ในไฟล์ PYC และเปิดใช้งาน

อย่างไรก็ตามหากมีข้อยกเว้นเกิดขึ้นคุณอาจได้รับคำอธิบายที่ทำให้เข้าใจผิดเล็กน้อยเนื่องจากบรรทัดXอาจมีรหัสที่แตกต่างจากก่อนที่คุณจะเริ่มสคริปต์


10
ไม่จำเป็นต้องเป็นไฟล์
Ignacio Vazquez-Abrams

60
แต่ถ้าคุณเปิดใช้งานใหม่ในขณะที่ทำงานเมื่อไฟล์ pyc ใหม่เขียนทับเก่ามันจะทำให้เกิดปัญหาในโปรแกรมที่ทำงานอยู่หรือไม่?
ชะลอตัวลง caviar

26
ไม่มีอะไรเกิดขึ้น. ฉันยังตรวจสอบในการทดสอบขนาดเล็ก จะเกิดอะไรขึ้น: pyc เป็นเพียงการรวบรวม และคอมไพเลอร์นี้ก็จะถูกโหลดเข้าสู่แรมแล้วก็ดำเนินการ ดังนั้นจึงเป็นไปได้ที่จะเปลี่ยนโปรแกรมคอมไพล์ใหม่และรันอินสแตนซ์อื่นเช่นในคอนโซลอื่น
Chris

7
@ Chris ฉันเริ่มอินสแตนซ์ของสคริปต์ python ของฉันในคอนโซลเดียว ขณะที่กำลังทำงานอยู่ฉันเปลี่ยนรหัสสองบรรทัดและเริ่มต้นอินสแตนซ์อื่นในคอนโซลแยกต่างหาก หลังจากชั่วขณะหนึ่งฉันพบข้อผิดพลาดจากคอนโซลแรกเกี่ยวกับโค้ดสองบรรทัดที่ฉันเปลี่ยนหลังจากเริ่มใช้งาน! กรุณาช่วย
double_j

14
@ Chris ฉันคิดว่าฉันรู้ว่าเกิดอะไรขึ้นที่นี่ หากคุณแก้ไขสคริปต์และบันทึกในขณะที่กำลังทำงานและข้อผิดพลาดของเวอร์ชันก่อนหน้าในการอ่านข้อมูลย้อนกลับมันจะเปิดไฟล์เวอร์ชันปัจจุบันและทำให้การสืบค้นกลับดูแตกต่างจากตอนที่คุณเริ่ม ฉันได้เห็นสิ่งนี้ด้วยตัวเองหลายครั้ง
double_j
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.