What is Python Bytecode?

Python is a hybrid interpreter. While running a program, it first assembles it into bytecode that can then be run in the Python interpreter, also known as Python virtual machine.

Example

>>> def hello():

 

… print “Hello, World”

 

 

>>> dis.dis(hello)

 

2 0 LOAD_CONST 1 (‘Hello, World’)

 

3 PRINT_ITEM

 

4 PRINT_NEWLINE

 

5 LOAD_CONST 0 (None)

 

8 RETURN_VALUE


The Python interpreter is stack-based and utilized a first-in last-out system. Every operation program (opcode) in the Python assembly language (the bytecode) takes a fixed number of elements from the stack and returns a fixed number of elements to the stack. If there are not just items on the stack for an opcode, the Python interpreter will crash, possibly without an error message.

Constants in the dis module
Example

EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands

 

HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands

 

cmp_op = (‘<‘, ‘<=’, ‘==’, ‘!=’, ‘>’, ‘>=’, ‘in’, ‘not in’, ‘is’, ‘is …

 

# A list of comparator id’s. The indices are used as operands in some opcodes

 

# All opcodes in these lists have the respective types as there operands

 

hascompare = [107]

 

hasconst = [100]

 

hasfree = [135, 136, 137]

 

hasfree = [135, 136, 137]

 

hasjrel = [93, 110, 120, 121, 122, 143]

 

haslocal = [124, 125, 126]

 

hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]

 

# A map of opcodes to ids

 

opmap = {‘BINARY_ADD’: 23, ‘BINARY_AND’: 64, ‘BINARY_DIVIDE’: 21, ‘BIN…

 

# A map of ids to opcodes

 

opname = [‘STOP_CODE’, ‘POP_TOP’, ‘ROT_TWO’, ‘ROT_THREE’, ‘DUP_TOP’, ‘…


Disassembling modules

To disassemble a Python module, first this has to be turned into a .pyc file (Python compiled). To do this, run

python -m compileall .py

Then in an interpreter, run

import dis

import marshal

with open(“.pyc”, “rb”) as code_f:

code_f.read(8) # Magic number and modification time

code = marshal.load(code_f) # Returns a code object which can be disassembled

dis.dis(code) # Output the disassembly

This will compile a Python module and output the bytecode instructions with dis. The module is never imported so it is safe to use with untrusted code.

The base64 Module
Parameters Parameters
base64.b64encode(s, altchars=None) s altchars A bytes-like object.
A bytes-like object of length 2+ of characters to replace the ‘+’ and ‘=’ characters when creating the Base64 alphabet. Extra characters are ignored.
base64.b64decode(s, altchars=None, validate=False)
s
altchars
validate
A bytes-like object
A bytes-like object of length 2+ of characters to restore the ‘+’ and ‘=’ characters when generating the Base64 alphabet. Extra characters are ignored.
If validate is True, the characters not in the normal Base64 alphabet or the alternative alphabet are not discarded before the padding check.
base64.standard_b64encode(s)
s
A bytes-like object
base64.standard_b64decode(s)
s
A bytes-like object
base64.urlsafe_b64encode(s)
s
A bytes-like object
base64.urlsafe_b64decode(s)
s
A bytes-like object
b32encode(s)
s
A bytes-like object
b32decode(s)
s
A bytes-like object
base64.b16encode(s)
s
A bytes-like object
base64.b16decode(s)
s
A bytes-like object
base64.a85encode(b, foldspaces=False, wrapcol=0, pad=False, adobe=False)
b
A bytes-like object
foldspaces If foldspaces is True, the character ‘y’ will be used instead of 4 consecutive spaces.
Encoding and Decoding Base64

We include the base64 module in our script, we should import it first:

Example1

import base64

 

s = “Hello World!”

 

b = s.encode(“UTF-8”)

 

The output of the last line would be:

 

b’Hello World!’

 

The b prefix is used to denote the value is a bytes object.

 

To Base64 encode these bytes, we use the base64.b64encode() function:


Example2

import base64

 

s = “Hello World!”

 

b = s.encode(“UTF-8”)

 

e = base64.b64encode(b)

 

print(e)


Output

When we execute the following commands, it displays the following output.

b’SGVsbG8gV29ybGQh’

which is still in the bytes object. To get a string out of these bytes, we can use Python’s decode() method with the UTF-8 encoding:

import base64

s = “Hello World!”

b = s.encode(“UTF-8”)

e = base64.b64encode(b)

s1 = e.decode(“UTF-8”) print(s1)

Output

SGVsbG8gV29ybGQh

 

If we wanted to encode the string and then decode we could use the base64.b64decode() method:

 

import base64

 

# Creating a string

 

s = “Hello World!”

 

# Encoding the string into bytes

 

b = s.encode(“UTF-8”)

 

# Base64 Encode the bytes

 

e = base64.b64encode(b)

 

# Decoding the Base64 bytes to string

 

s1 = e.decode(“UTF-8”)

 

# Printing Base64 encoded string

 

print(“Base64 Encoded:”, s1)

 

# Encoding the Base64 encoded string into bytes

 

b1 = s1.encode(“UTF-8”)

 

# Decoding the Base64 bytes

 

d = base64.b64decode(b1)

 

# Decoding the bytes to string

 

s2 = d.decode(“UTF-8”)

 

print(s2)


Output

When we execute the following command it displays the following output.

Base64 Encoded: SGVsbG8gV29ybGQh

 

Hello World!

Enroll Yourself: Python Training In Delhi



							
	                        

	                    

Copyright 1999- Ducat Creative, All rights reserved.