- Метод exec() в Python
- Пример 1
- Пример 2: Разрешить пользователю вводить данные
- На что обратить внимание?
- Ограничение использования доступных методов и переменных в exec()
- Параметры globals и locals опущены
- Передача глобальных параметров
- Передача пустого словаря в качестве глобального параметра
- Передача как глобальных, так и локальных словарей
- exec() in Python
- Use of Python exec() Function :
- Syntax for Python exec() Function :
- Parameters of Python exec() Function :
- Return Value of Python exec() Function :
- When Using Python exec() Function, Be Cautious
- Example
- What is exec() in Python?
- How to Use an exec() in Python?
- More Examples
- Example — 1 : How exec() Works ?
- Example — 2: Allow User to Provide Input
- Example — 3 : Execute Multi-line Code
- Example — 4 : Importing Modules
- Restricting the Use of Available Methods and Variables in Python exec() Function
- 1. Both Globals and Locals Parameters are Omitted
- 2. Passing Globals Parameter, Locals Parameter is Omitted
- 3. Passing Empty Dictionary as Globals Parameter :
- 4. Passing Both Globals and Locals Dictionary
- Conclusion
- See Also:
Метод exec() в Python
Метод exec() выполняет динамически созданную программу, которая представляет собой строку или объект кода.
exec(object, globals, locals)
Метод принимает три параметра:
- объект — Либо строка, либо объект кода.
- globals (необязательно) — словарь.
- locals (необязательно) — объект отображения. Словарь — это стандартный и часто используемый тип сопоставления в Python.
exec() не возвращает никакого значения, он возвращает None.
Пример 1
program = 'a = 5\nb=10\nprint("Sum EnlighterJSRAW" data-enlighter-language="python">Sum = 15
Здесь программа строкового объекта передаются Exec() , который выполняет программу. globals и locals в этом случае опускаются.
Пример 2: Разрешить пользователю вводить данные
program = input('Enter a program:') exec(program)
Enter a program: [print(item) for item in [1, 2, 3]] 1 2 3
Если вы хотите получить код Python от пользователя, который позволяет использовать многострочный код (с использованием ‘\ n’), вы можете использовать метод compile() перед использованием exec().
На что обратить внимание?
Рассмотрим ситуацию: вы используете систему Unix (macOS, Linux и т. Д.) И импортировали модуль ОС. Модуль os предоставляет переносимый способ использования функций операционной системы, таких как чтение или запись файла.
Если вы разрешаете пользователям вводить значение с помощью exec (input()), пользователь может вводить команды для изменения файла или даже удалять все файлы с помощью команды os.system (‘rm -rf *’).
Если вы используете в своем коде exec (input()), рекомендуется проверить, какие переменные и методы может использовать пользователь. Вы можете увидеть, какие переменные и методы доступны, используя метод dir().
from math import * exec('print(dir())')
['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']
Ограничение использования доступных методов и переменных в exec()
Чаще всего все доступные методы и переменные, используемые в exec(), могут не понадобиться или даже могут иметь брешь в безопасности. Вы можете ограничить использование этих переменных и методов, передав необязательные глобальные и локальные параметры (словари) методу exec().
Параметры globals и locals опущены
Если оба параметра опущены (как в наших предыдущих примерах), код, ожидаемый от exec(), выполняется в текущей области. Вы можете проверить доступные переменные и методы, используя следующий код:
Передача глобальных параметров
Параметры globals и locals (словари) используются для глобальных и локальных переменных соответственно. Если словарь locals не указан, по умолчанию используется словарь globals. Это означает, что глобальные переменные будут использоваться как для глобальных, так и для локальных переменных.
Передача пустого словаря в качестве глобального параметра
from math import * exec('print(dir())', <>) # This code will raise an exception # exec('print(sqrt(9))', <>)
Если вы передаете пустой словарь в качестве глобальных переменных, объекту доступны только __builtins__ (первый параметр для exec()). Несмотря на то, что мы импортировали математический модуль в вышеуказанную программу, попытка доступа к любой из функций, предоставляемых математическим модулем, вызовет исключение.
Обеспечение доступности определенных методов
from math import * exec('print(dir())', ) # object can have sqrt() module exec('print(sqrt(9))', )
Здесь код, который выполняется exec(), может также иметь методы sqrt() и pow() вместе с __builtins__.
Название метода можно изменить по своему желанию.
from math import * exec('print(dir())', ) # object can have squareRoot() module exec('print(squareRoot(9))', )
В приведенной выше программе squareRoot() вычисляет квадратный корень (функциональность аналогична sqrt()). Однако попытка использования sqrt() вызовет исключение.
Ограничение использования встроенных модулей. Вы можете ограничить использование __builtins__, задав значение None для ‘__builtins__’ в словаре глобальных переменных .
Передача как глобальных, так и локальных словарей
Вы можете сделать необходимые функции и переменные доступными для использования, передав словарь locals. Например:
from math import * globalsParameter = localsParameter = exec('print(dir())', globalsParameter, localsParameter)
Здесь только два встроенных метода print() и dir() могут быть выполнены методом exec().
Важно отметить, что exec() выполняет код и не возвращает никакого значения (не возвращает None). Следовательно, вы не можете использовать операторы return и yield вне определений функций.
exec() in Python
The program, which can be a string or a code object, is executed using the exec() method. Python exec() function accepts code in the form of a string or an object code and then executes it.
Use of Python exec() Function :
Python exec() function is used in the case when we run the program. Now the question is how? So, the python exec() function replaces the current processing image with the one you have just started.
Syntax for Python exec() Function :
Python exec() function takes 3 parameters: objects, globals, and locals. We will discuss those parameters further.
Parameters of Python exec() Function :
The python exec() function takes three parameters below.
- object :
It is the required one parameter. It can be either a string or a code object. This object provides the code or string to the exec() function for further execution. - globals :
It is an optional parameter. It is a dictionary of available global methods and variables. These globals provide the global methods and variables to the exec() function if needed. - locals :
It is an optional parameter, a dictionary of available local methods and variables. These locals provide the local methods and variables to the exec() function if needed.
Return Value of Python exec() Function :
exec() the function doesn’t return any value, it returns None. So outside of function declarations, we can’t use return and yield statements.
When Using Python exec() Function, Be Cautious
Let’s pretend we’re working on a Unix system like MacOS, Linux, or others, and we’ve imported a os module. This ‘os’ module now gives you a flexible approach to operating system functionalities, including reading and writing files. If you allow users to use exec(input()) to enter a value, they can execute the command os.system(‘rm -rf *’) to modify, alter, or even remove all of the OS’s files.
Furthermore, you should never send exec to an untrustworthy source() because it is quite easy for a rogue user to wreak havoc on the system.
Example
The example below will make you more clear with this exec() function.
In the above example, demo_lst = [ 4 , 5 , 3 , 2 , 1 ] = [4,5,3,2,1] = [ 4 , 5 , 3 , 2 , 1 ] is a string that is then parsed into a python statement and executed. Here we notice that we haven’t defined «demo_lst» in the code other than that string inside exec() . It shows that the exec() function executes that string and thus feeds up that demo_lst in python IDE during runtime, which is printed further.
What is exec() in Python?
The exec function is used to execute a python code that can either be a string or a code. If it’s a string, it’s parsed or processed into a sequence of Python statements, which are then performed until there’s a syntax error. If it’s a code, it is interpreted as python code for errors and is immediately executed.
- We must not use return statements outside of function declarations, and we must not use them in the scope of code provided to the exec function because exec() doesn’t return any value, it returns None. So we can’t use return and yield statements outside the function declaration.
- When invoking any methods within the exec function, it is important to remember which functions exec allows. To learn about those available functions, run the code given below.
So the above list contains all the functions we can use inside the exec() method.
How to Use an exec() in Python?
As shown previously in the example, for using this exec() function, we just have to pass the python program in the string or object format inside the exec() function.
More Examples
Example — 1 : How exec() Works ?
The above program is executed using the string object program, provided to exec() . In this situation, globals and locals are not used.
In the above program, the function sample() is defined inside the exec() method, which feeds that sample() function in python IDE during runtime for further access.
Example — 2: Allow User to Provide Input
From the above example, it is clear how to take input from the user itself in this exec() function.
Example — 3 : Execute Multi-line Code
In the above example, multi-line code is passed as a string to the exec() function, where each code line is considered a statement.
Example — 4 : Importing Modules
Here in the above example, it is clear that one can also import the libraries within the string that is passed to the exec() function further and can use the inbuilt functions of that library in the code.
Restricting the Use of Available Methods and Variables in Python exec() Function
Most of the time, all the accessible functions and variables in exec() aren’t needed, and some even have a security flaw. You can limit the use of such variables and functions by giving optional globals and local parameters (dictionaries) to the exec() method.
1. Both Globals and Locals Parameters are Omitted
The code expected to be executed by exec() is performed in the current scope if both parameters are omitted( missing ).
2. Passing Globals Parameter, Locals Parameter is Omitted
The global and local parameters are utilized for both global and local variables. If the local dictionary is not specified, the global dictionary is used instead. We can utilize global variables for both global and local variables.
3. Passing Empty Dictionary as Globals Parameter :
Only the builtins are available to the object if you provide an empty dictionary as globals. Even if the math module has been imported into the preceding program, any attempt to use any of the math module’s functions will result in an exception.
Making Certain Methods Available :
The code below shows that the the exec() function can pass some methods like sqrt() and pow() along with the builtins. Including the sqrt() and pow() function in global dict allows the exec() function to perform those operations otherwise it will throw error.
By the way, it is also possible to change the name of those methods as done below.
So in the code above, it will raise an error when trying to use «square root» but will work on «sqrt» because its name is changed.
4. Passing Both Globals and Locals Dictionary
By passing a local dictionary, one could make required functions and variables accessible for use.
So as in the above code, only 3 built-in functions could work are the «print», «dir», and «time». So here we have restricted the use of builtin functions by allowing only some of them inside the local’s dict.
Conclusion
- exec() function takes 3 parameters that is object, globals and locals.
- exec() method returns None.
- Return, and yield can’t be used outside function declaration in the exec() method.
- While invoking any function in exec() be sure that it is allowed or not.