2010-10-11 10 views

Odpowiedz

31

miałem ten sam pomysł, Frédéric, ale napisałem menedżera kontekstowe do obsługi zastępując 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

niesamowite dzięki bardzo dużo – user462794

+0

Mam: Plik "D: \ Documents \ perso \ dev \ meta \ Server.py", wiersz 77, w decompress_html z self.stdoutIO() jako s: AttributeError: __exit__ – user462794

+0

@ user462794: Wygląda na to, że zignorowałeś linię '@ contextlib.contextmanager'. –

1

Coś jak:

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

należy wykonać kod w innym procesie i rury wyjście z powrotem do programu głównego przez codeproc.stdout. Ale ja nie osobiście używał go więc jeśli jest coś zrobiłem źle czuć swobodnie wskazać go: P

+0

muszę zrobić to w python tylko:/dzięki za odpowiedź – user462794

+0

to jest tylko python: P – Blam

+0

Mam: codeproc = subprocess.Popen (command, stdout = subprocess.PIPE) Plik "C: \ DEV \ Python27 \ lib \ subprocess.py", wiersz 672, w __init__ errread, errwrite) Plik "C: \ DEV \ Python27 \ lib \ subprocess.py ", wiersz 882, w _execute_child startupinfo) WindowsError: [Błąd 2] Le fichier spécifié est introuvable (plik nie został znaleziony w języku francuskim) – user462794

7

można przekierować standardowe wyjście na ciąg na czas trwania rozmowy: 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

Po prostu chciałem dodać notatkę, aby ten przyjaciel Python 3 ly, musisz zaimportować 'StringIO' z' io' => 'from io import StringIO'. – idjaw

2

Oto Py3 wersja z @ Jochen za odpowiedź. Dodałem także klauzulę try-except, aby odzyskać w przypadku błędów w code.

import sys 
from io import StringIO 
import contextlib 

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

code = """ 
i = [0,1,2] 
for j in i : 
    print(j) 
""" 
with stdoutIO() as s: 
    try: 
     exec(code) 
    except: 
     print("Something wrong with the code") 
print "out:", s.getvalue() 
1

Oto mała korekta odpowiedzi Frédéric. Musimy obsłużyć ewentualny wyjątek w exec(), aby powrócić normalnie stdout. W przeciwnym razie nie moglibyśmy widzieć dalej print wyjść:

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 
Powiązane problemy