Index
- built_in_functions
- Python abs()
- Python all()
- Python any()
- Python ascii()
- Python bin()
- Python bool()
- Python bytearray()
- Python bytes()
- Python callable()
- Python chr()
- Python classmethod()
- Python compile()
- Python complex()
- Python delattr()
- Python dict()
- Python dir()
- Python divmod()
- Python enumerate()
- Python eval()
- Python exec()
- Python filter()
- Python float()
- Python format()
- Python frozenset()
- Python getattr()
- Python globals()
- Python hasattr()
- Python hash()
- Python help()
- Python hex()
- Python id()
- Python input()
- Python int()
- Python isinstance()
- Python issubclass()
- Python iter()
- Python len()
- Python list()
- Python locals()
- Python map()
- Python max()
- Python memoryview()
- Python min()
- Python next()
- Python object()
- Python oct()
- Python open()
- Python ord()
- Python pow()
- Python print()
- Python property()
- Python range()
- Python repr()
- Python reversed()
- Python round()
- Python set()
- Python setattr()
- Python slice()
- Python sorted()
- Python staticmethod()
- Python str()
- Python sum()
- Python super()
- Python tuple() Function
- Python type()
- Python vars()
- Python zip()
- Python __import__()
- python1compute
- Python Program to Find Hash of File
- Python Program to Find the Size (Resolution) of a Image
- Python Program to Merge Mails
- Python Program to Count the Number of Each Vowel - Source Code: Using a list and a dictionary comprehension
- Python Program to Count the Number of Each Vowel - Source Code: Using Dictionary
- Python Program to Illustrate Different Set Operations
- Python Program to Sort Words in Alphabetic Order
- Python Program to Remove Punctuations From a String
- Python Program to Multiply Two Matrices - Matrix Multiplication Using Nested List Comprehension
- Python Program to Multiply Two Matrices - Source Code: Matrix Multiplication using Nested Loop
- Python Program to Transpose a Matrix - Matrix Transpose using Nested List Comprehension
- Python Program to Transpose a Matrix - Matrix Transpose using Nested Loop
- Python Program to Add Two Matrices - Source Code: Matrix Addition using Nested List Comprehension
- Python Program to Check Whether a String is Palindrome or Not
- Python Program to Add Two Matrices - Source code: Matrix Addition using Nested Loop
- Python Program to Convert Decimal to Binary Using Recursion
- Python Program to Find Factorial of Number Using Recursion
- Python Program to Find Sum of Natural Numbers Using Recursion
- Python Program to Display Fibonacci Sequence Using Recursion
- Python Program to Display Calendar
- Python Program to Shuffle Deck of Cards
- Python Program to Make a Simple Calculator
- Python Program to Find Factors of Number
- Python Program to Find LCM - Without using GCD function
- Python Program to Find HCF or GCD - Source Code: Using Euclidean Algorithm
- Python Program to Find LCM - Source Code: Using GCD function
- Python Program to Find HCF or GCD - Source Code: Using Loops
- Python Program to Find ASCII Value of Character
- Python Program to Convert Decimal to Binary, Octal and Hexadecimal
- Python Program to Find Numbers Divisible by Another Number
- Python Program To Display Powers of 2 Using Anonymous Function
- Python Program to Find the Sum of Natural Numbers
- Python Program to Find Armstrong Number in an Interval
- Python Program to Check Armstrong Number - Source Code: Check Armstrong number of n digits
- Python Program to Check Armstrong Number - Source Code: Check Armstrong number (for 3 digits)
- Python Program to Print the Fibonacci sequence
- Python Program to Display the multiplication Table
- Python Program to Find the Factorial of a Number
- Python Program to Print all Prime Numbers in an Interval
- Python Program to Find the Largest Among Three Numbers
- Python Program to Check Prime Number
- Python Program to Check Leap Year
- Python Program to Check if a Number is Odd or Even
- Python Program to Check if a Number is Positive, Negative or 0 Source Code: Using Nested if
- Python Program to Check if a Number is Positive, Negative or 0 Source Code: Using if...elif...else
- Python Program to Convert Celsius To Fahrenheit
- Python Program to Generate a Random Number
- Python Program to Convert Kilometers to Miles
- Python Program to Swap Two Variables Source Code: Without Using Temporary Variable
- Python Program to Swap Two Variables Source Code: Using temporary variable
- Python Program to Solve Quadratic Equation
- Python Program to Calculate the Area of a Triangle
- Python Program to Find the Square Root Source code: For real or complex numbers using cmath module
- Python Program to Find the Square Root Source Code: For positive numbers using exponent **
- Python Program to Add Two Numbers By One Line
- Python Program to Add Two Numbers Source Code: Add Two Numbers Provided by The User
- Python Program to Add Two Numbers
- Python Program to Print Hello world!
- python2based
Description exec()
Python exec()
The exec() method executes the dynamically created program, which is either a string or a code object.
The syntax of exec();
exec(object, globals, locals)
exec() Parameters
The exec() takes three parameters:
• object - Either a string or a code object
• globals (optional) - a dictionary
• locals (optional)- a mapping object. Dictionary is the standard and commonly used mapping type in Python.
The use of globals and locals will be discussed later in the article.
Return Value from exec()
The exec() doesn't return any value, it returns
None
.Example 1: How exec() works?
------------------------------------------------------------------------------
program = 'a = 5\nb=10\nprint("Sum =", a+b)'
exec(program)
-------------------------------------------------------------------------------
When you run the program, the output will be:
Sum = 15Here, the string object program is passed to exec() which executes the program. globals and locals are omitted in this case.
Example 2: Allow user to provide input
-------------------------------------------------------------------------------
program = input('Enter a program:')
exec(program)
--------------------------------------------------------------------------------
When you run the program, the output will be:
Enter a program: [print(item) for item in [1, 2, 3]]
1
2
3If you want to take Python code from the user which allows multiline code (using
'\n'
), you can use compile()
method before using exec().Learn more about compile() method in Python.
Be careful while using exec()
Consider a situation, you are using a Unix system (macOS, Linux etc) and you have imported
os
module. The os module provides portable way to use operating system functionalities like: read or write a file.If you allow users to input a value using
exec(input())
, the user may issue commands to change file or even delete all the files using command os.system('rm -rf *')
.If you are using
exec(input())
in your code, it's a good idea to check which variables and methods the user can use. You can see which variables and methods are available using dir() method.-------------------------------------------------------------------------------------
from math import *
exec('print(dir())')
--------------------------------------------------------------------------------------
When you run the program, the output will be:
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', '_ih', '_ii', '_iii', '_oh', '_sh', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'get_ipython', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
Restricting the Use of Available Methods and Variables in exec()
More often than not, all the available methods and variables used in exec() may not be needed, or even may have a security hole. You can restrict the use of these variables and methods by passing optional globals and locals parameters (dictionaries) to the exec() method.
1. Both globals and locals parameters are omitted
If both parameters are omitted (as in our earlier examples), the code expected to be executed by exec() is executed in the current scope. You can check the available variables and methods using the following code:
exec('print(dir())')
Passing globals parameter; locals parameter is omitted
The globals and locals parameters (dictionaries) are used for global and local variables respectively. If the locals dictionary is omitted, it defaults to globals dictionary. Meaning, globals will be used for both global and local variables.
Note: You can check the current global and local dictionary in Python using globals() and locals() built-in methods respectively.
Passing empty dictionary as globals parameter
-------------------------------------------------------------------------------------------------
from math import *
exec('print(dir())', {})
# This code will raise an exception
# exec('print(sqrt(9))', {})
----------------------------------------------------------------------------------------------------
If you pass an empty dictionary as globals, only the
__builtins__
are available to the object
(first parameter to the exec()). Even though we have imported math module in the above program, trying to access any of the functions provided by the math module will raise an exception.When you run the program, the output will be:
['__builtins__']
Making Certain Methods available
-------------------------------------------------------------------------------------------------------
from math import *
exec('print(dir())', {'sqrt': sqrt, 'pow': pow})
# object can have sqrt() module
exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})
-----------------------------------------------------------------------------------------------------------
Here, the code that is executed by exec() can also have
sqrt()
and pow()
methods along with __builtins__
.It's possible to change the name of the method according to your wish.
-----------------------------------------------------------------------------------------------------------
from math import *
exec('print(dir())', {'squareRoot': sqrt, 'pow': pow})
# object can have squareRoot() module
exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})
------------------------------------------------------------------------------------------------------------
In the above program,
squareRoot()
calculates the square root (similar functionality like sqrt()
). However, trying to use sqrt()
will raise an exception.Restricting the Use of built-ins
You can restrict the use of
__builtins__
by giving value None
to the '__builtins__'
in the globals dictionary.exec(object, {'__builtins__': None})
3. Passing both globals and locals dictionary
You can make needed functions and variables available for use by passing locals dictionary. For example:
---------------------------------------------------------------------------------------------------------------
from math import *
globalsParameter = {'__builtins__' : None}
localsParameter = {'print': print, 'dir': dir}
exec('print(dir())', globalsParameter, localsParameter)
-----------------------------------------------------------------------------------------------------------------
When you run the program, the output will be:
['dir', 'print']
Here, only two built-in methods print() and dir() can be executed by the exec() method.
It's important to note that, exec() executes the code and doesn't return any value (returns
None
). Hence, you cannot use return and yield statements outside of the function definitions.