LINUX.ORG.RU

[Python] Как выполнить откомпилированный байткод?

 


0

0

Дорогой интернет, у меня дурацкий вопрос. Есть скрипт на Питоне (версия 2.4.3). Вот такой:

#try.py:
print 2+3

Я компилирую его в байткод. Вот так:

import py_compile
py_compile.compile("try.py")

И запускаю его в терминале:

./try.pyc

Получаю ответ:

bash: ./try.pyc: Отказано в доступе

Что я делаю не так?

anonymous

*.pyc запускаются не ядром, а интерпретатором Питона:

python ./try.pyc

tailgunner ★★★★★
()

chmod +x ./try.pyc

anonymous
()

$ cat test.py
print 10 + 10

$ py_compilefiles test.py

$ file test.pyc
test.pyc: python 2.4 byte-compiled

$ chmod +x test.pyc

$ ./test.pyc 
20

sdio ★★★★★
()

tailgunner, спасибо. Все верно!

Предложение с chmod +x будет работать только с *.py (в котором должно быть чего-нибудь вроде: #! /usr/bin/python). Для откомпилированного кода (try.pyc) будет:

bash: ./try.pyc: cannot execute binary file

Логично.

anonymous
()
Ответ на: комментарий от anonymous

> Предложение с chmod +x будет работать только с *.py (в котором должно быть чего-нибудь вроде: #! /usr/bin/python)

Не только. Если в ядре сконфигурирован binfmt_misc, то оно само вызовет интерпретатор, как в примере sdio. Но это непереносимо даже между Linux-дистрами.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

И опять спасибо! Настроил binfmt_misc для файлов *.pyc (вдруг пригодится кому):

cd /proc/sys/fs/binfmt_misc
echo ':Python:E::pyc::/usr/bin/python:' > register

Хотя, думаю, есть более изящный способ, чтобы работало и с оптимизированным байткодом (который *.pyo).

anonymous
()
Ответ на: комментарий от anonymous

$ cat /proc/sys/fs/binfmt_misc/python2.4 
enabled
interpreter /usr/bin/python2.4
flags: 
offset 0
magic 6df20d0a

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.