2010-10-11 16 views

Répondre

31

J'ai eu la même idée que Frédéric, mais je l'ai écrit un gestionnaire de contexte pour gérer le remplacement stdout:

import sys 
import StringIO 
import contextlib 

@contextlib.contextmanager 
def stdoutIO(stdout=None): 
    old = sys.stdout 
    if stdout is None: 
     stdout = StringIO.StringIO() 
    sys.stdout = stdout 
    yield stdout 
    sys.stdout = old 

code = """ 
i = [0,1,2] 
for j in i : 
    print j 
""" 
with stdoutIO() as s: 
    exec code 

print "out:", s.getvalue() 
+0

incroyable merci beaucoup – user462794

+0

J'ai un: Fichier "D: \ Documents \ Perso \ Dev \ Meta \ Server.py", ligne 77, dans decompress_html avec self.stdoutIO() comme s: AttributeError: __exit__ – user462794

+0

@ user462794: Il semble que vous ayez ignoré la ligne '@ contextlib.contextmanager' –

1

Quelque chose comme:

codeproc = subprocess.Popen(code, stdout=subprocess.PIPE) 
print(codeproc.stdout.read()) 

doit exécuter le code dans un processus différent et redirigez la sortie à votre programme principal via codeproc.stdout. Mais je ne l'ai pas personnellement utilisé donc s'il y a quelque chose que j'ai fait de mal ne hésitez pas à le signaler: P

+0

je dois le faire en python que:/Merci pour la réponse – user462794

+0

il est en python seulement: P – Blam

+0

j'ai un: codeproc = subprocess.Popen (commande, stdout = subprocess.PIPE) Fichier "C: \ DEV \ Python27 \ lib \ sous-processus.py", ligne 672, dans __init__ errread, errwrite) Fichier "C: \ DEV \ Python27 \ lib \ subprocess.py ", ligne 882, dans _execute_child startupinfo) WindowsError: [Erreur 2] Le fichier spécifié est introuvable – user462794

7

Vous pouvez rediriger la sortie standard à une chaîne pendant toute la durée de l'appel exec:

code = """ 
i = [0,1,2] 
for j in i : 
print j 
""" 

from cStringIO import StringIO 
old_stdout = sys.stdout 
redirected_output = sys.stdout = StringIO() 
exec(code) 
sys.stdout = old_stdout 

print redirected_output.getvalue() 
+2

Je voulais juste ajouter la note que pour faire de ce Python 3 ami ly, vous devez importer 'StringIO' de' io' => 'à partir de io import StringIO'. – idjaw

2

Voici la version PY3-friendly de @ réponse de Jochen. J'ai également ajouté try-except clause à récupérer en cas d'erreurs dans le code.

1

Voici une petite correction de la réponse de Frédéric. Nous devons gérer une exception possible dans exec() pour revenir à la normale stdout. Sinon, nous ne pouvions pas voir plus loin print sorties:

code = """ 
i = [0,1,2] 
for j in i : 
print j 
""" 

from cStringIO import StringIO 
old_stdout = sys.stdout 
redirected_output = sys.stdout = StringIO() 
try: 
    exec(code) 
except: 
    raise 
finally: # ! 
    sys.stdout = old_stdout # ! 

print redirected_output.getvalue() 
... 
print 'Hello, World!' # now we see it in case of the exception above