2010-10-11 2 views

ответ

31

Я была такая же идея, как Фредерик, но я написал менеджер контекста для обработки заменяющий стандартный вывод:

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

удивительные спасибо – user462794

+0

я получил: Файл "D: \ Documents \ персидско \ DEV \ мета \ Server.py", строка 77, в decompress_html с self.stdoutIO() как с: AttributeError: __exit__ – user462794

+0

@ user462794: Кажется, вы проигнорировали строку '@ contextlib.contextmanager' –

1

Что-то вроде:

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

должен выполнять код в другом процессе и трубы выход обратно в основной программе через codeproc.stdout. Но я лично не использовал его, так что если есть что-то я сделал не так, не стесняйтесь указать на это: P

+0

я должен сделать это в Python только:/Спасибо за ответ – user462794

+0

оно только питона: P – Blam

+0

я получил: codeproc = subprocess.Popen (command, stdout = subprocess.PIPE) Файл «C: \ DEV \ Python27 \ lib \ subprocess.py», строка 672, в __init__ errread, errwrite) Файл «C: \ DEV \ Python27 \ lib \ subprocess.py ", строка 882, в _execute_child startupinfo) WindowsError: [Ошибка 2] Le fichier spécifié est introuvable (файл не найден на французском языке) – user462794

7

Вы можете перенаправить стандартный вывод в строку на время ехес вызова:

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

Просто хотел добавить примечание, чтобы сделать этого друга Python 3 ly, вам нужно импортировать 'StringIO' из' io' => 'из io import StringIO'. – idjaw

2

Вот PY3 дружественный вариант @ ответ Йохена. Я также добавил try-except пункт, чтобы восстановить в случае ошибок в 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

Вот небольшая коррекция ответа Фредерика. Нам нужно обработать возможное исключение в exec() для возврата назад stdout. В противном случае мы не могли видеть дальше print выходов:

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 
Смежные вопросы