ไฟล์ * .pyc ทำงานอย่างไร


6

ฉันสังเกตว่าการอิมพอร์ตไฟล์ Python ที่สามารถเรียกทำงานได้จะบันทึกไฟล์ * .py [co] ตามที่คาดไว้ ฉันสุ่มสงสัยว่าฉันจะสามารถเรียกใช้ไฟล์นี้ได้โดยตรงหรือไม่และใช้งานได้!

ขั้นตอนในการทำซ้ำ:

$ echo 'print "Worked."' > testcase.py
$ chmod u+x testcase.py
$ python -c 'import testcase'
Worked.
$ ./testcase.pyc
Worked.

มันทำงานอย่างไร เหตุใดฉันจึงไม่ได้รับข้อความแสดงข้อผิดพลาด เป็นระบบของฉัน Ubuntu 9.04 ทำสิ่งพิเศษหรือฉันลืมบางสิ่งเกี่ยวกับวิธีการทำงานของ Linux โดยทั่วไป

$ python --version
Python 2.6.2
$ hd testcase.pyc
00000000  d1 f2 0d 0a a4 4f 08 4b  63 00 00 00 00 00 00 00  |.....O.Kc.......|
00000010  00 01 00 00 00 40 00 00  00 73 09 00 00 00 64 00  |.....@...s....d.|
00000020  00 47 48 64 01 00 53 28  02 00 00 00 73 07 00 00  |.GHd..S(....s...|
00000030  00 57 6f 72 6b 65 64 2e  4e 28 00 00 00 00 28 00  |.Worked.N(....(.|
00000040  00 00 00 28 00 00 00 00  28 00 00 00 00 73 0b 00  |...(....(....s..|
00000050  00 00 74 65 73 74 63 61  73 65 2e 70 79 74 08 00  |..testcase.pyt..|
00000060  00 00 3c 6d 6f 64 75 6c  65 3e 01 00 00 00 73 00  |..<module>....s.|
00000070  00 00 00                                          |...|
00000073

(รวมถึง hexdump เพื่อแสดงว่าไม่มีเส้น shebang และการอ่านเกี่ยวกับรูปแบบ. pyc ไม่มีอะไรที่นี่ที่ไม่เฉพาะเจาะจงกับ Python)

คำตอบ:



0

ไฟล์. pyc เป็นรุ่นที่คอมไพล์ด้วยไบต์ของไฟล์. py ดั้งเดิม เมื่อไฟล์. py ถูกดำเนินการโดย python ไฟล์นั้นจะตรวจสอบก่อนว่ามีไฟล์. pyc ที่มีชื่อเหมือนกันหรือไม่และไฟล์. py ดั้งเดิมไม่ได้ถูกแก้ไขตั้งแต่สร้างไฟล์ ทั้งสองอย่างนี้เป็นจริงจากนั้นจะเรียกใช้งานไฟล์. pyc เนื่องจากสามารถบันทึกขั้นตอนของการรวบรวมไฟล์. py จึงทำให้เวลาในการประมวลผลเร็วขึ้น ดังนั้นไฟล์. pyc สามารถใช้งานได้จริงเหมือนกับที่คุณค้นพบ


ส่วนใหญ่เป็นความจริง แต่ไม่ได้ตอบคำถามที่ถามจริง (ซึ่ง Chris พบคำตอบ)

-1

เพียงเพราะไฟล์ถูกทำเครื่องหมายว่าปฏิบัติการไม่ได้หมายความว่าระบบปฏิบัติการรู้วิธีการใช้งาน สิ่งที่เกิดขึ้นที่นี่คือไฟล์. pyc สืบทอดการอนุญาตบางอย่าง (หรือสันนิษฐานสิทธิ์ระบบไฟล์เริ่มต้นตัวอย่างเช่นหากคุณอยู่ในไดรฟ์ FAT32 ใน Linux)

โดยทั่วไปคุณจะไม่เรียกใช้ไฟล์. pyc Python เก็บไว้เพื่อไม่จำเป็นต้องคอมไพล์รหัสใหม่ทุกครั้งที่นำเข้า


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