exec फ़ंक्शन पायथन प्रोग्राम के कोड को डायनामिक रूप से निष्पादित कर सकता है। कोड को स्ट्रिंग या ऑब्जेक्ट कोड के रूप में इस फ़ंक्शन में पास किया जा सकता है। ऑब्जेक्ट कोड को जैसा है वैसा ही निष्पादित किया जाता है जबकि स्ट्रिंग को पहले पार्स किया जाता है और किसी भी सिंटैक्स त्रुटि के लिए जांचा जाता है। यदि कोई सिंटैक्स त्रुटि नहीं है, तो पार्स की गई स्ट्रिंग को पायथन स्टेटमेंट के रूप में निष्पादित किया जाता है।
exec() फ़ंक्शन का सिंटैक्स
exec(object, globals, locals)
जहां
Object - एक स्ट्रिंग या कोड ऑब्जेक्ट जो मेथड को पास किया जाता है।
globals - उपलब्ध ग्लोबल मेथड्स और वेरिएबल्स का एक डिक्शनरी।
locals - उपलब्ध लोकल मेथड्स और वेरिएबल्स का एक डिक्शनरी।
स्ट्रिंग पास करना
नीचे दिए गए उदाहरण में हम exec() फ़ंक्शन को स्ट्रिंग के रूप में कोड की एक लाइन पास करते हैं। यह पार्स होकर निष्पादित होता है और आउटपुट देता है।
x = 9\nexec('print(5*x)')आउटपुट
उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
45
कोड ऑब्जेक्ट पास करना
अब हम देखते हैं कि कोड के ब्लॉक को कैसे पास किया जाए जिसमें कई कोड स्टेटमेंट हों। चूंकि यह एक कोड ऑब्जेक्ट है, यह सीधे निष्पादित होकर परिणाम देता है। कृपया ध्यान दें कि हमने पायथन कोड ब्लॉक को उचित इंडेंटेशन के साथ बनाने के लिए \n और स्पेस का उपयोग कैसे किया है।
उदाहरण
prog_block = 'x = 3 \nif(x < 5): \n print(x*x)'\nexec(prog_block)
आउटपुट
उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
9
ग्लोबल और लोकल पैरामीटर्स के बिना
जब हम ग्लोबल और लोकल पैरामीटर के लिए कोई मान पास नहीं करते हैं, तो हमें प्रोग्राम में आयात किए गए पैकेज के अनुसार डिफ़ॉल्ट उपलब्ध फ़ंक्शन मिलते हैं। नीचे दिए गए उदाहरण में हम देखते हैं कि जब दोनों ग्लोबल और लोकल पैरामीटर मान छोड़े जाते हैं तो कोड हमें सभी उपलब्ध फ़ंक्शन देता है।
from time import *\nexec("print(dir())")उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']
ग्लोबल पैरामीटर्स के साथ प्रतिबंध लागू करना
हम आयात किए गए मॉड्यूल के किसी भी फ़ंक्शन तक पहुंच को प्रतिबंधित कर सकते हैं एक खाली डिक्शनरी को ग्लोबल पैरामीटर के रूप में पास करके। इस मामले में परिणाम केवल बिल्ट-इन फ़ंक्शन दिखाएगा और आयात किए गए मॉड्यूल का कोई फ़ंक्शन नहीं दिखाएगा। इस तरह हम फ़ंक्शन को प्रतिबंधित और अधिक सुरक्षित बनाते हैं।
उदाहरण
from time import *\nexec("print(dir())", {})आउटपुट
उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
['__builtins__']
केवल चयनित फ़ंक्शन की अनुमति देना
अब हम देखते हैं कि हम आयात किए गए मॉड्यूल से केवल कुछ चुने हुए फ़ंक्शन को ग्लोबल विकल्प के साथ पैरामीटर के रूप में exec() मेथड में कैसे लागू कर सकते हैं। नीचे दिए गए उदाहरण में हम केवल आवश्यक फ़ंक्शन को ग्लोबल विकल्प के साथ पैरामीटर के रूप में अनुमति देते हैं। localtime() फ़ंक्शन टाइम मॉड्यूल का हिस्सा है जिसे प्रोग्राम में आयात किया गया है।
from time import *\nexec("print(localtime())", {"localtime": localtime})आउटपुट
उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)
लोकल पैरामीटर्स पास करना
हम आयात किए गए मॉड्यूल के विभिन्न फ़ंक्शन के उपयोग को लोकल पैरामीटर का उपयोग करके और बिल्ट-इन फ़ंक्शन को पूरी तरह से बाहर करके भी प्रतिबंधित कर सकते हैं। नीचे दिए गए उदाहरण में हम बिल्ट-इन ग्लोबल पैरामीटर के लिए None मान चुनते हैं।
उदाहरण
from time import *\nexec("print(dir())", {"__builtins__": None}, {"gtime": gmtime, "print": print, "dir": dir})उपरोक्त कोड चलाने पर निम्न परिणाम मिलता है:
['dir', 'gtime', 'print']