Как выполняются * .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.)


источник

Ответы:

8

Возможно, в вашей системе есть запись binfmt_misc для .pycфайлов. Ищите /proc/sys/fs/binfmt_miscзапись.

Крис Джонсен
источник
0

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

momeara
источник
В основном верно, но не обращайтесь к фактически заданному вопросу (на который Крис нашел ответ).
-1

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

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

Pridkett
источник
3
Правда, но не тот вопрос, который я задаю. Я выполнил файл, и он работал, вместо того, чтобы выдавать ошибку. Как это случилось?