Exec Python ()

La méthode exec () exécute le programme créé dynamiquement, qui est soit une chaîne, soit un objet de code.

La syntaxe de exec():

 exec (objet, globaux, locaux)

Paramètres exec ()

exec() prend trois paramètres:

  • object - Soit une chaîne, soit un objet de code
  • globals (facultatif) - un dictionnaire
  • locals (facultatif) - un objet de mappage. Dictionary est le type de mappage standard et couramment utilisé en Python.

L'utilisation des globaux et des locaux sera discutée plus loin dans l'article.

Valeur renvoyée par exec ()

exec()ne renvoie aucune valeur, il retourne None.

Exemple 1: Comment fonctionne exec ()?

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

Production

 Somme = 15

Ici, le programme objet de chaîne est passé à exec()qui exécute le programme. les globaux et les locaux sont omis dans ce cas.

Exemple 2: autoriser l'utilisateur à fournir une entrée

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

Production

 Entrez un programme: (imprimer (élément) pour l'élément dans (1, 2, 3)) 1 2 3

Si vous souhaitez prendre du code Python de l'utilisateur qui autorise le code multiligne (en utilisant ''), vous pouvez utiliser la compile()méthode avant d'utiliser exec().

En savoir plus sur la méthode compile () en Python.

Soyez prudent lorsque vous utilisez exec ()

Prenons une situation, vous utilisez un système Unix (macOS, Linux, etc.) et vous avez un osmodule importé . Le module os fournit un moyen portable d'utiliser les fonctionnalités du système d'exploitation comme la lecture ou l'écriture d'un fichier.

Si vous autorisez les utilisateurs à saisir une valeur à l'aide de exec(input()), l'utilisateur peut émettre des commandes pour changer de fichier ou même supprimer tous les fichiers à l'aide de la commande os.system('rm -rf *').

Si vous utilisez exec(input())dans votre code, c'est une bonne idée de vérifier les variables et méthodes que l'utilisateur peut utiliser. Vous pouvez voir quelles variables et méthodes sont disponibles en utilisant la méthode dir ().

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

Production

('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', 'degrés', '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')

Restreindre l'utilisation des méthodes et variables disponibles dans exec ()

Le plus souvent, toutes les méthodes et variables disponibles utilisées dans exec()peuvent ne pas être nécessaires, ou même avoir une faille de sécurité. Vous pouvez restreindre l'utilisation de ces variables et méthodes en passant des paramètres globaux et locaux facultatifs (dictionnaires) à exec()method.

1. Les paramètres globaux et locaux sont omis

Si les deux paramètres sont omis (comme dans nos exemples précédents), le code censé être exécuté par exec()est exécuté dans la portée actuelle. Vous pouvez vérifier les variables et méthodes disponibles à l'aide du code suivant:

 exec ('imprimer (dir ())')

2. Passer le paramètre globals; le paramètre local est omis

Les paramètres globaux et locaux (dictionnaires) sont utilisés respectivement pour les variables globales et locales. Si le dictionnaire local est omis, il utilise par défaut le dictionnaire global. Cela signifie que les globaux seront utilisés pour les variables globales et locales.

Remarque: Vous pouvez vérifier le dictionnaire global et local actuel en Python en utilisant respectivement les méthodes intégrées globals () et locals ().

3. Passer un dictionnaire vide en tant que paramètre global

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

Si vous passez un dictionnaire vide sous forme de globaux, seuls les __builtins__sont disponibles pour le object(premier paramètre de exec ()). Même si nous avons importé un module mathématique dans le programme ci-dessus, essayer d'accéder à l'une des fonctions fournies par le module mathématique lèvera une exception.

Production

 («__builtins__»)

Rendre certaines méthodes disponibles

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

Ici, le code exécuté par exec () peut également avoir sqrt()et des pow()méthodes avec __builtins__.

Il est possible de changer le nom de la méthode selon votre souhait.

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

Dans le programme ci-dessus, squareRoot()calcule la racine carrée (fonctionnalité similaire comme sqrt()). Cependant, essayer d'utiliser sqrt()lèvera une exception.

Restriction de l'utilisation des éléments intégrés

Vous pouvez restreindre l'utilisation de __builtins__en donnant une valeur Noneà '__builtins__'dans le dictionnaire global.

 exec (objet, ('__builtins__': Aucun)) 

4. Passer à la fois le dictionnaire global et local

Vous pouvez rendre les fonctions et les variables nécessaires disponibles pour une utilisation en passant le dictionnaire local. Par exemple:

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

Production

 ('dir', 'imprimer') 

Ici, seules deux méthodes intégrées print () et dir () peuvent être exécutées par exec()method.

Il est important de noter que, exec()exécute le code et ne renvoie aucune valeur (retourne None). Par conséquent, vous ne pouvez pas utiliser les instructions return et yield en dehors des définitions de fonction.

Articles intéressants...