L'exécution de code Python contenues dans une chaîne de caractères
Je suis en train d'écrire un moteur de jeu à l'aide de pygame et box2d, et dans le caractère builder, je veux être capable d'écrire du code qui sera exécuté sur les événements keydown.
Mon plan était d'avoir un éditeur de texte dans le caractère générateur de rapports qui vous permettent d'écrire du code similaire à:
if key == K_a:
## Move left
pass
elif key == K_d:
## Move right
pass
Je vais récupérer le contenu de l'éditeur de texte comme une chaîne de caractères, et je veux le code à exécuter dans une méthode dans cette méthode de Personnage:
def keydown(self, key):
## Run code from text editor
Quelle est la meilleure façon de le faire?
OriginalL'auteur Brad Zeis | 2009-06-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
eval(string)
méthode pour ce faire.Définition
eval(code, globals=None, locals=None)
Le code est juste norme de code Python - ce qui signifie qu'il doit encore être correctement indenté.
Les variables globales peuvent avoir un personnalisé
__builtins__
définies, ce qui pourrait être utile pour des raisons de sécurité.Exemple
Serait d'imprimer
hello
à la console. Vous pouvez également spécifier des variables locales et globales pour le code à utiliser:Préoccupations En Matière De Sécurité
Être prudent, cependant. Toute entrée d'utilisateur sera exécuté. Considérer:
Il y a un certain nombre de façons. Le plus simple est de faire quelque chose comme:
Qui va lever une exception, plutôt que de l'effacer de votre disque dur. Alors que votre programme est de bureau, cela peut être un problème si les gens redistribué les scripts, qui, j'imagine, est prévu.
Étrange Exemple
Voici un exemple d'utilisation de
eval
plutôt étrange:Ce que cela fait sur les eval ligne est:
contrivedExample
pour le script). Le consommateur peut appelercontrivedExample.hello()
maintenant).hi
comme pointant vershello
ÉCHOUER
Il s'avère (merci les commentateurs!) que vous avez réellement besoin d'utiliser le
exec
déclaration. Gros oups. La version révisée exemples sont comme suit:exec
Définition(Cela vous semble familier!)
Exec est une déclaration:
exec "code" [in scope]
D'où la portée est un dictionnaire à la fois des variables locales et globales. Si cela n'est pas spécifié, il s'exécute dans le champ d'application actuel.
Le code est juste norme de code Python - ce qui signifie qu'il doit encore être correctement indenté.
exec
ExempleSerait d'imprimer
hello
à la console. Vous pouvez également spécifier des variables locales et globales pour le code à utiliser:exec
Préoccupations En Matière De SécuritéÊtre prudent, cependant. Toute entrée d'utilisateur sera exécuté. Considérer:
Instruction Print
Comme noté par certains intervenants,
print
est une déclaration dans toutes les versions de Python antérieures à la version 3.0. En 2.6, le comportement peut être modifié en tapantfrom __future__ import print_statement
. Sinon, utilisez:Au lieu de :
Ouais si il utilise pygame il est à l'aide de python2.x car je ne crois pas qu'ils ont une version python3.
La fonction eval() prend uniquement en charge de l'évaluation des expressions Python, non arbitraire des états. L'instruction exec doit être utilisé pour les déclarations.
Je viens de tester de cette manière interactive, et oui, Greg est à droite (comme prévu!). J'ai modifié ma réponse et gardé les vieux trucs pour la postérité. J'ai aussi inclus un pas sur l'instruction print.
OriginalL'auteur Lucas Jones
Comme d'autres l'ont souligné, vous pouvez charger le texte dans une chaîne de caractères et l'utilisation
exec "codestring"
. Si elles sont contenues dans un fichier, à l'aide de execfile permet d'éviter d'avoir à le charger.Une performance note: Vous devriez éviter de execing le code plusieurs fois, comme l'analyse et la compilation de la source python est un processus lent. c'est à dire. n'ont pas:
Vous pouvez améliorer un peu par la compilation de la source en un code objet (avec
compile()
et exec, ou mieux, par la construction d'une fonction qui vous garder autour, et de construire seulement une fois. Soit demander à l'utilisateur d'écrire "def my_handler(args...)", ou ajouter vous-même, et de faire quelque chose comme:Puis plus tard:
OriginalL'auteur Brian
Vous pouvez utiliser
eval()
OriginalL'auteur anthony
eval ou exec. Vous devez absolument lire Python de référence de la bibliothèque avant de programmation.
OriginalL'auteur stepancheg