Шебанг для скомпилированного кода Python

Я использовал, чтобы добавить строку Shebang в верхней части скрипта Python, как,

#!/usr/bin/python
...

И я могу выполнить файл my.py,

chmod a+r my.py
./my.py

Но после компиляции в байт-код сценарий может быть выполнен только на python, и shebang больше не работает.

python my.pyc

Есть ли способ сделать Shebang работоспособным для скомпилированного скрипта Python?

./my.pyc

3 ответа

Решение

Шебанг работает только для текстовых скриптов, а не для двоичных файлов. Тем не менее, вы можете использовать binfmt_misc выполнить *.pyc файлы напрямую, как сообщается в этой ветке Python ML:

В Linux вы можете использовать binfmt_misc для создания исполняемых файлов из кода PyC. Бежать:

import imp,sys,string
magic = string.join(["\\x%.2x" % ord(c) for c in imp.get_magic()],"") 
reg = ':pyc:M::%s::%s:' % (magic, sys.executable) 
open("/proc/sys/fs/binfmt_misc/register","wb").write(reg)

один раз в вашей системе Linux (или, скорее, во время загрузки), и все pyc-файлы становятся исполняемыми (если установлен бит x).

В Debian установка пакета binfmt-support сделает это за вас.

(мой акцент, обратите внимание, что это будет применяться ко всем производным Debian, включая Ubuntu. То же решение работает и в Fedora).

Нет. Но вы можете использовать другие специфичные для ОС механизмы для вызова произвольных исполняемых файлов, например, binfmt_misc.

Вот обновленная версия ответа Стефано Санфилиппо на python 3:

import imp,sys,string
magic = "".join(["\\x%.2x" % c for c in imp.get_magic()])
reg = ':pyc:M::%s::%s:' % (magic, sys.executable) 
open("/proc/sys/fs/binfmt_misc/register","w").write(reg)
Другие вопросы по тегам