Метода екец () извршава динамички креирани програм, који је или низ или објект кода.
Синтакса exec()
:
екец (објекат, глобални, локално становништво)
параметри екец ()
exec()
узима три параметра:
- објект - Или низ или објект кода
- глобали (опционо) - речник
- локално становништво (опционално) - објекат за мапирање. Речник је стандардни и често коришћени тип мапирања у Питхону.
Коришћење глобалаца и локалног становништва биће речи касније у чланку.
Повратна вредност из екец ()
exec()
не враћа никакву вредност, враћа се None
.
Пример 1: Како функционише екец ()?
program = 'a = 5b=10print("Sum =", a+b)' exec(program)
Оутпут
Збир = 15
Овде се преноси објектни низ програма exec()
који извршава програм. у овом случају изостављени су глобални и локални становници.
Пример 2: Дозволите кориснику да унесе унос
program = input('Enter a program:') exec(program)
Оутпут
Унесите програм: (испис (ставка) за ставку у (1, 2, 3)) 1 2 3
Ако желите да преузмете Питхон код од корисника који дозвољава вишередни код (помоћу ''
), можете да користите compile()
метод пре употребе exec()
.
Сазнајте више о цомпиле () методи у Питхону.
Будите опрезни док користите екец ()
Размотрите ситуацију, користите Уник систем (мацОС, Линук итд.) И имате увезени os
модул. Ос модул пружа преносиви начин за коришћење функционалности оперативног система попут читања или писања датотеке.
Ако дозволите корисницима да унесу вредност помоћу exec(input())
, корисник може издавати наредбе за промену датотеке или чак брисање свих датотека помоћу наредбе os.system('rm -rf *')
.
Ако користите exec(input())
свој код, било би добро проверити које променљиве и методе корисник може да користи. Помоћу методе дир () можете видети које су променљиве и методе доступне.
from math import * exec('print(dir())')
Оутпут
('Ин', 'Оут', '_', '__', '___', '__буилтин__', '__буилтинс__', '__наме__', '_дх', '_и', '_и1', '_и2', ' _их ',' _ии ',' _иии ',' _ох ',' _сх ',' ацос ',' ацосх ',' асин ',' асинх ',' атан ',' атан2 ',' атанх ',' цеил ' , 'цописигн', 'цос', 'цосх', 'степени', 'е', 'ерф', 'ерфц', 'екит', 'екп', 'екпм1', 'фабс', 'фацториал', ' спрат ',' фмод ',' фрекп ',' фсум ',' гама ',' гцд ',' гет_ипитхон ',' хипот ',' инф ',' исцлосе ',' исфините ',' исинф ',' иснан ' , 'лдекп', 'лгамма ',' лог ',' лог10 ',' лог1п ',' лог2 ',' модф ',' нан ',' пи ',' пов ',' куит ',' радианс ',' син ',' синх ' , 'скрт', 'тан', 'танх', 'трунц')
Ограничавање употребе доступних метода и променљивих у екец ()
Чешће него не, све доступне методе и променљиве које се користе exec()
можда нису потребне, или чак могу имати сигурносну рупу. Употребу ових променљивих и метода можете ограничити прослеђивањем опционих глобалних и локалних параметара (речника) exec()
методи.
1. Изостављени су и глобални и локални параметри
Ако су оба параметра изостављена (као у нашим ранијим примерима), код за који се очекује да ће се извршити exec()
извршава се у тренутном опсегу. Доступне променљиве и методе можете проверити помоћу следећег кода:
екец ('принт (дир ())')
2. Пролазни глобални параметар; Параметар локално становништво је изостављен
Глобални и локални параметри (речници) користе се за глобалне и локалне променљиве. Ако је речник локалног становништва изостављен, подразумевано се користи глобални речник. Значи, глобали ће се користити и за глобалне и за локалне променљиве.
Напомена: Тренутни глобални и локални речник у Питхону можете проверити помоћу уграђених метода глобалс () и лоцал ().
3. Додавање празног речника као глобалног параметра
from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())
Ако проследите празан речник као глобални, само __builtins__
су доступни object
(првом параметру у екец ()). Иако смо увели математички модул у горе наведени програм, покушај приступа било којој функцији коју пружа математички модул створиће изузетак.
Оутпут
('__изграђени__')
Омогућавање одређених метода
from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))
Овде код који извршава екец () такође може имати sqrt()
и pow()
методе заједно са __builtins__
.
Могуће је променити назив методе према вашој жељи.
from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))
У горњем програму squareRoot()
израчунава квадратни корен (слична функција попут sqrt()
). Међутим, покушај употребе sqrt()
створиће изузетак.
Ограничавање употребе уграђених компоненти
Можете ограничити коришћење __builtins__
дајући вредности None
до '__builtins__'
у речнику ГлобалС.
екец (објект, ('__буилтинс__': Ниједан))
4. Полагање и глобалног и локалног речника
Потребне функције и променљиве можете учинити доступним за употребу прослеђивањем локалног речника. На пример:
from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)
Оутпут
('дир', 'принт')
Овде се само две уграђене методе принт () и дир () могу извршити exec()
методом.
Важно је напоменути да, exec()
извршава код и не враћа никакву вредност (враћа None
). Стога не можете користити наредбе ретурн и ииелд изван дефиниција функције.