Как *.pyc файлы выполняются?

Я заметил, что импорт исполняемого файла 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 для показа нет никакой строки хижины, и читающий о .pyc формате, нет ничего здесь, которое не очень характерно для Python.)

6
задан 21.11.2009, 22:53

3 ответа

Возможно, Ваша система имеет binfmt_misc запись для .pyc файлы. Заглянуть /proc/sys/fs/binfmt_misc для записи.

8
ответ дан 07.12.2019, 16:05

Просто, потому что файл отмечен, исполняемый файл не означает, что ОС знает, как выполнить его. Что произошло, вот то, что .pyc файл наследовал некоторые полномочия (или принял полномочия файловой системы по умолчанию, например, если Вы находитесь на диске FAT32 в Linux).

В целом Вы не выполняете .pyc файлы. Python хранит их так, он не должен перекомпилировать код каждый раз, когда он импортируется.

-1
ответ дан 07.12.2019, 16:05

Файлы .pyc являются скомпилированными версиями байта исходного .py файла. Когда .py файл выполняется Python, он сначала проверяет, чтобы видеть, существует ли .pyc файл с тем же именем и что исходный .py файл не был изменен, так как .pyc файл был создан. Это оба из них верны затем, что это выполняет .pyc файл, потому что это может сохранить шаг байта, компилирующего .py файл, таким образом делающий время выполнения быстрее. Таким образом, .pyc файл действительно является исполняемым файлом точно так же, как Вы обнаружили.

0
ответ дан 07.12.2019, 16:05

Теги

Похожие вопросы