English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Python

Contrôle de flux Python

Fonctions en Python

Types de données en Python

Opérations de fichiers Python

Objets et classes Python

Dates et heures Python

Connaissances avancées Python

Manuel de référence Python

Utilisation et exemples de exec() en Python

Python built-in functions

La méthode exec() exécute un programme créé dynamiquement, qui peut être une chaîne de caractères ou un objet de code.

grammaire de exec()

exec(object, globals, locals)

paramètres de exec()

exec() prend trois paramètres :

  • objet -chaîne de caractères ou objet de code

  • globals (optionnel)-dictionnaire

  • locals(optionnel)-l'objet de correspondance. Les dictionnaires sont un type de correspondance standard couramment utilisé en Python.

qui seront discutées plus tard dans cet articlevariables globales(globals) et (locals) localvariablel'utilisation.

Retour de exec()

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

Example1Comment fonctionne exec() ?

program = 'a =' 5\nb=10\nprint("Sum =", a)+b)'
exec(program)

When running the program, the output is:

Sum = 15

Dans cet exemple, l'objet chaîne programme est passé à exec() pour exécuter le programme. Les variables globales (globals) et (locals sont omises.)Variables locales.

Example2:Permet à l'utilisateur de fournir des entrées

program = input('Programme d'entrée:')
exec(program)

When running the program, the output is:

Programme d'entrée: [print(item) for item in [1, 2, 3]]
1
2
3

Si vous devez obtenir du code Python (en utilisant '\n') d'un utilisateur autorisé à entrer plusieurs lignes de code, vous pouvez utiliser la méthode compile() avant exec().

En savoir plus surMéthode compile() en PythonPlus d'informations.

Soyez prudent lors de l'utilisation de exec()

Considérez un cas où vous utilisez un système Unix (macOS, Linux, etc.) et avez importé le module os. Le module os fournit des méthodes portables pour utiliser les fonctionnalités de l'exploitation système, par exemple : lire ou écrire des fichiers.

Si l'utilisateur est autorisé à utiliser exec(input()) pour entrer des valeurs, il peut exécuter des commandes pour modifier des fichiers, ou même utiliser command pour supprimer tous les fichiers os.system('rm) -rf *)。

Si exec(input()) est utilisé dans le code, il est préférable de vérifier quels variables et méthodes l'utilisateur peut utiliser. Vous pouvez utiliserMéthode dir()Voir les variables et les méthodes disponibles.

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

When running the program, the output is:

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i'1', _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, floor, fmod, frexp, fsum, gamma, gcd, get_ipython, hypot, inf, isclose, isfinite, isinf, isnan, ldexp, lgamma, log, log10', 'log'1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'

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

Généralement, il n'est pas nécessaire d'utiliser tous les méthodes et variables disponibles dans exec(), même s'il peut y avoir des vulnérabilités de sécurité. Vous pouvez limiter l'utilisation des méthodes et variables disponibles dans exec() en utilisant l'optionglobalsandlocalsparamètres (dictionnaire) sont transmis à la méthode exec() pour limiter l'utilisation de ces variables et méthodes.

1. Les paramètres (dictionnaire) globaux et locaux (locals) sont tous deux omis

Si les deux paramètres sont omis (comme dans notre exemple précédent), exec() s'attend à exécuter le code dans la portée actuelle. Vous pouvez utiliser le code suivant pour vérifier les variables et méthodes disponibles :

exec('print(dir())')

transmettre des paramètres globaux ; omis locals paramètres

(globals) et (locals)est omis(dictionnaire),respectivement pour les variables globales et locales. Si le paramètrelocalsdictionnaire, il est par défautglobalsdictionnaire. Cela signifie que,Variable globale (globals)sera utilisé pour les variables globales et locales.

Attention :Vous pouvez utiliser séparémentglobals()andlocals()Les méthodes intégrées dans Python vérifient le dictionnaire global et local actuels.

transmettre un dictionnaire vide en tant que paramètre global

from math import *
exec('print(dir())', {})
# Ce code déclenche une exception
# exec('print(sqrt(9))', {}

Si un dictionnaire vide est utilisé commeglobalstransmis, seul __builtins__ est disponible pour l'objet (le premier paramètre de exec()). Même si nous avons importé le module math dans le programme ci-dessus, tentons d'accédermodule mathToute fonction fournie déclenchera une exception.

When running the program, the output is:

__builtins__

rendre certaines méthodes disponibles

from math import *
exec('print(dir())', {'sqrt': sqrt, 'pow': pow})
# L'objet peut avoir le module sqrt()
exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})

Ici, le code exécuté par exec() peut également disposer des méthodes sqrt() et pow() ainsi que de __builtins__.

The name of the method can be changed according to your wishes.

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

In the above program, squareRoot() calculates the square root (similar functions, such as sqrt()). However, trying to use sqrt() will raise an exception.

Limit the use of built-in

You can limit the use of __builtins__ by setting __builtins__ to None in the globals dictionary.

exec(object, {'__builtins__': None})

3. Through global and local dictionaries

You can passLocalUsing the (locals) dictionary to make the required functions and variables available. For example:

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

When running the program, the output is:

['dir', 'print']

In this case, the exec() method can only execute two built-in methodsprint()anddir().

It should be especially noted that exec() executes code and does not return any value (returns None). Therefore, you cannot use return andyieldsentence.

Python built-in functions