Python exec ()

Η μέθοδος exec () εκτελεί το δυναμικά δημιουργημένο πρόγραμμα, το οποίο είναι είτε μια συμβολοσειρά είτε ένα αντικείμενο κώδικα.

Η σύνταξη του exec():

 exec (αντικείμενο, σφαιρικοί, ντόπιοι)

exec () Παράμετροι

exec() παίρνει τρεις παραμέτρους:

  • αντικείμενο - Είτε μια συμβολοσειρά είτε ένα αντικείμενο κώδικα
  • globals (προαιρετικό) - λεξικό
  • ντόπιοι (προαιρετικά) - ένα αντικείμενο χαρτογράφησης. Το λεξικό είναι ο τυπικός και κοινώς χρησιμοποιούμενος τύπος χαρτογράφησης στο Python.

Η χρήση σφαιρικών και ντόπιων θα συζητηθεί αργότερα στο άρθρο.

Τιμή επιστροφής από exec ()

exec()δεν επιστρέφει καμία τιμή, επιστρέφει None.

Παράδειγμα 1: Πώς λειτουργεί το exec ();

 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

Εάν θέλετε να πάρετε τον κωδικό Python από τον χρήστη που επιτρέπει τον κώδικα πολλαπλών γραμμών (χρήση ''), μπορείτε να χρησιμοποιήσετε τη compile()μέθοδο πριν από τη χρήση exec().

Μάθετε περισσότερα για τη μέθοδο compile () στο Python.

Να είστε προσεκτικοί κατά τη χρήση του exec ()

Εξετάστε μια κατάσταση, χρησιμοποιείτε ένα σύστημα Unix (macOS, Linux κ.λπ.) και έχετε εισαγάγει osμονάδα. Η λειτουργική μονάδα 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", " δάπεδο "," 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()μέθοδο.

1. Οι παράμετροι των σφαιρικών και των τοπικών παραλείπονται

Εάν παραλείπονται και οι δύο παράμετροι (όπως στα προηγούμενα παραδείγματα), ο κώδικας που αναμένεται να εκτελεστεί exec()εκτελείται στο τρέχον πεδίο. Μπορείτε να ελέγξετε τις διαθέσιμες μεταβλητές και μεθόδους χρησιμοποιώντας τον ακόλουθο κώδικα:

 exec ('εκτύπωση (dir ())')

2. Παράμετρος διέλευσης σφαιρών. Η παράμετρος locals παραλείπεται

Οι παράμετροι σφαιρικών και τοπικών (λεξικά) χρησιμοποιούνται για καθολικές και τοπικές μεταβλητές αντίστοιχα. Εάν το λεξικό ντόπιων παραλειφθεί, προεπιλογή στο λεξικό σφαιρών. Δηλαδή, τα σφαιρικά θα χρησιμοποιηθούν τόσο για παγκόσμιες όσο και για τοπικές μεταβλητές.

Σημείωση: Μπορείτε να ελέγξετε το τρέχον παγκόσμιο και τοπικό λεξικό στο Python χρησιμοποιώντας ενσωματωμένες μεθόδους globals () και locals () αντίστοιχα.

3. Περνώντας άδειο λεξικό ως παράμετρος σφαιρών

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

Εάν περάσετε ένα κενό λεξικό ως σφαιρικά, μόνο τα __builtins__διαθέσιμα στο object(πρώτη παράμετρος στο exec ()). Παρόλο που έχουμε εισαγάγει μαθηματική ενότητα στο παραπάνω πρόγραμμα, η προσπάθεια πρόσβασης σε οποιαδήποτε από τις λειτουργίες που παρέχονται από τη μαθηματική ενότητα θα δημιουργήσει μια εξαίρεση.

Παραγωγή

 ('__builtins__')

Διάθεση ορισμένων μεθόδων

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Εδώ, ο κώδικας που εκτελείται από το exec () μπορεί επίσης να έχει 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__'λεξικό globals.

 exec (αντικείμενο, ('__builtins__': Κανένα)) 

4. Περνώντας λεξικά σφαιρών και ντόπιων

Μπορείτε να κάνετε τις απαραίτητες λειτουργίες και μεταβλητές διαθέσιμες για χρήση, περνώντας το λεξικό των ντόπιων. Για παράδειγμα:

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Παραγωγή

 ('dir', 'print') 

Εδώ, μόνο δύο ενσωματωμένες μέθοδοι εκτύπωσης () και dir () μπορούν να εκτελεστούν με exec()μέθοδο.

Είναι σημαντικό να σημειωθεί ότι, exec()εκτελεί τον κώδικα και δεν επιστρέφει καμία τιμή (επιστροφές None). Ως εκ τούτου, δεν μπορείτε να χρησιμοποιήσετε δηλώσεις επιστροφής και απόδοσης εκτός των ορισμών της συνάρτησης.

ενδιαφέροντα άρθρα...