Я подробно писал об этом здесь , поэтому я не буду повторять это, но дам некоторые краткие комментарии.
Это определенно выполнимо, но мне интересно, насколько вообще это будет полезно.Ссылка посвящена тому, как запускать и записывать такие вещи.
Байт-код может изменяться как с точки зрения кода операции, так и с именами кода операции или семантики кодов операции между версиями.На самом деле, в Python 3.6 и выше байт-код становится кодовым словом.
Если вы все же решите пойти по этому пути xdis недавно добавил функцию list2bytecode()
, чтобы сделать это.
Если вы предпочитаете работать в текстовом файле, поскольку написано большинство ассемблерного кода, я написал для этого xasm .Вот пример сборки в формате, который можно использовать:
# Python bytecode 3.6 (3379)
# Method Name: five
# Filename: /tmp/five.pl
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 1
# Flags: 0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED)
# First Line: 1
# Constants:
# 0: None
# 1: 5
2:
LOAD_CONST (5)
RETURN_VALUE
# Method Name: <module>
# Filename: /tmp/five.pl
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 2
# Flags: 0x00000040 (NOFREE)
# First Line: 1
# Constants:
# 0: <code object five at 0x0000>
# 1: 'five'
# 2: None
# Names:
# 0: five
# 1: print
1:
LOAD_CONST 0 (<code object five at 0x0000>)
LOAD_CONST ('five')
MAKE_FUNCTION 0
STORE_NAME (five)
3:
LOAD_NAME (print)
LOAD_NAME (five)
CALL_FUNCTION 0
CALL_FUNCTION 1
POP_TOP
LOAD_CONST (None)
RETURN_VALUE