पायथन निष्पादन ()

निष्पादन () विधि गतिशील रूप से बनाए गए प्रोग्राम को निष्पादित करती है, जो या तो एक स्ट्रिंग या एक कोड ऑब्जेक्ट है।

का सिंटैक्स exec():

 निष्पादन (ऑब्जेक्ट, ग्लोबल्स, लोकल)

exec () पैरामीटर

exec() तीन पैरामीटर लेता है:

  • ऑब्जेक्ट - या तो एक स्ट्रिंग या एक कोड ऑब्जेक्ट
  • ग्लोबल्स (वैकल्पिक) - एक शब्दकोश
  • स्थानीय (वैकल्पिक) - एक मैपिंग ऑब्जेक्ट। शब्दकोश पायथन में मानक और आमतौर पर इस्तेमाल किया जाने वाला मानचित्रण प्रकार है।

ग्लोबल्स और स्थानीय लोगों के उपयोग पर बाद में लेख में चर्चा की जाएगी।

निष्पादन से वापसी मान ()

exec()इसका कोई मूल्य नहीं है, यह वापस लौटता है None

उदाहरण 1: कैसे निष्पादित () काम करता है?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

आउटपुट

 योग = १५

यहां, स्ट्रिंग ऑब्जेक्ट प्रोग्राम पास किया गया है exec()जो प्रोग्राम को निष्पादित करता है। ग्लोबल्स और स्थानीय लोगों को इस मामले में छोड़ दिया जाता है।

उदाहरण 2: उपयोगकर्ता को इनपुट प्रदान करने की अनुमति दें

  program = input('Enter a program:') exec(program) 

आउटपुट

 एक कार्यक्रम दर्ज करें: (1, 2, 3) में आइटम के लिए (प्रिंट) आइटम 1 2 3

यदि आप उस उपयोगकर्ता से पायथन कोड लेना चाहते हैं जो मल्टीलाइन कोड (उपयोग करना '') की अनुमति देता है , तो आप उपयोग compile()करने से पहले विधि का उपयोग कर सकते हैं exec()

पायथन में संकलन () विधि के बारे में अधिक जानें।

निष्पादन का उपयोग करते समय सावधान रहें ()

एक स्थिति पर विचार करें, आप एक यूनिक्स प्रणाली (macOS, लिनक्स आदि) का उपयोग कर रहे हैं और आपके पास आयातित osमॉड्यूल है। ओएस मॉड्यूल ऑपरेटिंग सिस्टम फ़ंक्शंस का उपयोग करने के लिए एक पोर्टेबल तरीका प्रदान करता है जैसे कि फ़ाइल को पढ़ना या लिखना।

यदि आप उपयोगकर्ताओं को एक मान का उपयोग करने की अनुमति देते हैं exec(input()), तो उपयोगकर्ता फ़ाइल को बदलने के लिए आदेश जारी कर सकता है या कमांड का उपयोग करके सभी फ़ाइलों को हटा भी सकता है os.system('rm -rf *')

यदि आप exec(input())अपने कोड में उपयोग कर रहे हैं , तो यह जांचना अच्छा है कि उपयोगकर्ता किन चर और तरीकों का उपयोग कर सकता है। आप देख सकते हैं कि dir () पद्धति का उपयोग करके कौन से चर और तरीके उपलब्ध हैं।

 from math import * exec('print(dir())')

आउटपुट

' _ह ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' ceil ' , 'कॉपीसाइन', 'कॉस', 'कॉश', 'डिग्रियां', 'ई', 'एरफ', 'एर्गफेक', 'एग्जिट', 'एक्सप', 'एक्सपम 1', 'फैब्स', 'फैक्टोरियल,' मंजिल ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' hypot ',' inf ',' isclose ',' isfont ',' isinf ',' isnan ' , 'ldexp', 'लैगमा ',' लॉग ',' लॉग 10 ',' लॉग 1 पी ',' लॉग 2 ',' मॉडफ ',' नैन ',' पाई ',' पॉव ',' लीव ',' रेडियंस ',' पाप ',' साइन ' , 'sqrt', 'tan', 'tanh', 'trunc')

निष्पादन में उपलब्ध तरीकों और चर के उपयोग को प्रतिबंधित करना ()

अधिक बार नहीं, उपयोग किए जाने वाले सभी उपलब्ध तरीकों और चर की exec()आवश्यकता नहीं हो सकती है, या यहां तक ​​कि एक सुरक्षा छेद भी हो सकता है। आप वैकल्पिक चर और स्थानीय मापदंडों (शब्दकोशों) को exec()विधि में पारित करके इन चर और विधियों के उपयोग को प्रतिबंधित कर सकते हैं ।

1. दोनों ग्लोबल्स और लोकल पैरामीटर को छोड़ दिया जाता है

यदि दोनों मापदंडों को छोड़ दिया जाता है (जैसा कि हमारे पहले के उदाहरणों में), exec()तो वर्तमान दायरे में निष्पादित कोड अपेक्षित है । आप निम्न कोड का उपयोग करके उपलब्ध चर और विधियों की जांच कर सकते हैं:

 निष्पादन ('प्रिंट (dir))')

2. ग्लोबल्स पैरामीटर पास करना; स्थानीय पैरामीटर को छोड़ दिया जाता है

वैश्विक और स्थानीय चर के लिए क्रमशः ग्लोबल्स और लोकल पैरामीटर (शब्दकोशों) का उपयोग किया जाता है। अगर स्थानीय शब्दकोश को छोड़ दिया जाए, तो यह शब्दकोष के शब्दकोश में चूक जाता है। मतलब, ग्लोबल्स का उपयोग वैश्विक और स्थानीय दोनों प्रकार के चर के लिए किया जाएगा।

नोट: आप मौजूदा वैश्विक और स्थानीय शब्दकोश को क्रमशः ग्लोबल्स () और स्थानीय लोगों () में निर्मित तरीकों का उपयोग करके जांच सकते हैं।

3. खाली शब्दकोष को ग्लोबल्स पैरामीटर के रूप में पास करना

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

यदि आप एक खाली शब्दकोश को ग्लोबल्स के रूप में पारित करते __builtins__हैं , तो केवल object(निष्पादन के लिए पहला पैरामीटर) () के लिए उपलब्ध हैं। भले ही हमने उपरोक्त कार्यक्रम में गणित मॉड्यूल को आयात किया है, लेकिन गणित मॉड्यूल द्वारा प्रदान किए गए किसी भी फ़ंक्शन का उपयोग करने की कोशिश एक अपवाद को बढ़ाएगी।

आउटपुट

 ('__builtins__')

कुछ विधियाँ उपलब्ध कराना

 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)) 

4. 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)

Output

 ('dir', 'print') 

यहां, केवल दो बिल्ट-इन मेथड्स प्रिंट () और डीआईआर () को exec()विधि द्वारा निष्पादित किया जा सकता है ।

यह नोट करना महत्वपूर्ण है कि, exec()कोड निष्पादित करता है और किसी भी मूल्य (रिटर्न None) को वापस नहीं करता है । इसलिए, आप फ़ंक्शन परिभाषाओं के बाहर रिटर्न और उपज स्टेटमेंट का उपयोग नहीं कर सकते।

दिलचस्प लेख...