2010-09-26 7 views
0

Comment exécuter un programme python reçu par un client du serveur sans l'écrire dans un nouveau fichier python?programmation réseau en python

+5

Je suis curieux de savoir pourquoi vous devez faire cela. Vous voulez élaborer? –

Répondre

3
code = "for a in range(10):\n\tprint 'lol'\n" 
eval(compile(code, 'downloaded_code_fake_filename', 'exec')) 

mais attention aux problèmes de sécurité! Le code source doit être signé cryptographiquement et non transmis en clair.

+0

code = "pour un intervalle compris entre (10): \ n \ tprint 'lol' \ n" eval (compile (code, 'code-téléchargé_fichier_fichier', 'exec')) ne l'a pas compris. pourriez-vous expliquer un peu? –

+0

@Ani: Dans sa réponse @BatchyX a donné un exemple de la façon d'exécuter le code que vous recevez d'un client. 'code' est un exemple de fragment de code; copiez-le sur IDLE et imprimez-le pour voir à quoi il ressemble. 'eval' est une fonction intégrée qui évalue l'extrait de code assigné à la variable' code'. Voir les documents: http://docs.python.org/library/functions.html#eval –

+2

est la fonction exec obsolète? Ne pourrait-il pas simplement 'exec (code)'? – Manux

0

voir http://docs.python.org/py3k/library/functions.html#exec pour la fonction exec(). il n'est pas déprécié dans py3.1. Je recommande de faire simplement exec(code). Les valeurs peuvent être transmises par l'inspection des variables soit dans le dictionnaire globals ou les habitants:

code = """ 
def f(): return 42 
R = f() 
""" 
d = {} 
exec(code, d) 
print(d[ 'R' ]) 
1

Je vous recommande d'utiliser execnet. C'est bien supporté et d'après ce que j'ai lu beaucoup plus sûr qu'un exec ou eval brut. Pour ce que vous essayez de faire, consultez le basic examples.

+0

brillant! et un moyen intéressant et utile de faire du traitement distribué/agent en python. – user106514

0

La réponse de Dcolish est bonne. Je ne suis pas sûr que l'idée d'exécuter du code sur une interface réseau soit bonne en soi, mais vous devrez vérifier que vous pouvez faire confiance à l'expéditeur, surtout si cette interface va être exposée à Internet ou vraiment tout réseau de production.