Comment exécuter une chaîne contenant du code Python en Python ?
Mais qu'en est-il de la portée du code exécuté par 'exec' ? est-il imbriqué ?
Comment exécuter une chaîne contenant du code Python en Python ?
Pour les déclarations, utilisez exec(string)
(Python 2/3) ou exec string
(Python 2) :
>>> mycode = 'print "hello world"'
>>> exec(mycode)
Hello world
Lorsque vous avez besoin de la valeur d'une expression, utilisez eval(string)
:
>>> x = eval("2+2")
>>> x
4
Cependant, la première étape devrait être de se demander si vous en avez vraiment besoin. L'exécution du code devrait généralement être la position de dernier recours : Il est lent, laid et dangereux s'il peut contenir du code saisi par l'utilisateur. Vous devriez toujours commencer par envisager des alternatives, telles que des fonctions d'ordre supérieur, pour voir si elles peuvent mieux répondre à vos besoins.
Un cas courant où quelqu'un veut utiliser "exec" est quelque chose comme if s=='foo': x.foo = 42 elif s=='bar': x.bar = 42
etc., qu'ils peuvent ensuite écrire sous la forme exec ("x.%s = 42" % s)
. Pour ce cas courant (où vous avez seulement besoin d'accéder à l'attribut d'un objet qui est stocké dans une chaîne de caractères), il existe une fonction beaucoup plus rapide, plus propre et plus sûre getattr
: écrivez simplement getattr(x, s) = 42
pour signifier la même chose.
Dans l'exemple, une chaîne de caractères est exécutée en tant que code à l'aide de la fonction exec.
import sys
import StringIO
# create file-like string to capture output
codeOut = StringIO.StringIO()
codeErr = StringIO.StringIO()
code = """
def f(x):
x = x + 1
return x
print 'This is my output.'
"""
# capture output and errors
sys.stdout = codeOut
sys.stderr = codeErr
exec code
# restore stdout and stderr
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
print f(4)
s = codeErr.getvalue()
print "error:\n%s\n" % s
s = codeOut.getvalue()
print "output:\n%s" % s
codeOut.close()
codeErr.close()
Échanger stdout et stderr comme ça me rend très nerveux. cela semble pouvoir causer d'énormes problèmes de sécurité. y a-t-il un moyen de contourner cela ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
6 votes
Pour être honnête, contrairement à l'autre question, celle-ci n'est pas un doublon. Et d'autres ont posté des questions beaucoup plus basiques que celle-ci.
11 votes
La réponse correcte, bien sûr, est presque toujours "ne le faites pas !".
24 votes
@S. Lott : Vous n'avez pas lu la FAQ récemment ? "Vous pouvez aussi parfaitement poser votre propre question de programmation et y répondre, mais faites comme si vous étiez à Jeopardy : formulez-la sous la forme d'une question". Ce n'est pas une mauvaise question. +1
0 votes
@Devin Jeanpierre : Je ne suis pas satisfait des pseudo-questions du type "SO est mon blog". Comment séparer les gens qui ont vraiment besoin d'aide des gens qui bloguent des gens qui n'essaient même pas d'écrire leur propre code.
54 votes
@S.Lott : Vous ne le faites pas. Vous n'en avez pas besoin. Si la question n'est pas déjà sur le site, alors elle est recevable (selon la FAQ, comme déjà indiqué). Répondez simplement à chaque question comme si le PO avait besoin d'aide. Il se peut qu'il n'en ait pas besoin, mais le prochain qui lira sa question en aura probablement besoin. Ce ne sont que mes deux centimes.
1 votes
À tous ceux qui disent de ne pas le faire : J'ai un cas où je dois absolument le faire. Il s'agit d'un traitement distribué.
0 votes
C'est abusif, mais pas parce qu'il pose et répond à sa propre question, c'est abusif parce que c'est une manipulation trompeuse de ce qu'ils disent quand ils disent
it's explicitly encouraged to ask and answer your own question
. Il s'agit d'appeler explicitement des problèmes difficiles à résoudre avec lesquels vous avez lutté et pour lesquels vous n'avez pas trouvé de réponse en cherchant. Il ne s'agit pas de dire d'utiliser StackOverflow comme un blog. L'utiliser comme tel, bien que peut-être pas contre les règles en raison de la façon dont ils ont formuléit's perfectly ok
vous n'avez techniquement pas tort, mais c'est néanmoins une exploitation des mots.0 votes
Salut, hekevintran ! Pourriez-vous envisager d'accepter une réponse ? celui d'allan pourrait m'aider dans ma recherche