2010-10-11 40 views
20

Tôi gặp vấn đề nhỏ. Đây là mã của tôi:python: lấy đầu ra in trong câu lệnh exec

code = """ 
i = [0,1,2] 
for j in i : 
    print j 
""" 
result = exec(code) 

Làm cách nào để in những thứ in ra? Làm thế nào tôi có thể nhận được một cái gì đó như:

0 
1 
2 

Kính trọng và cảm ơn,

Trả lời

31

tôi đã có ý tưởng tương tự như Frédéric, nhưng tôi đã viết một người quản lý bối cảnh để xử lý thay thế 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

cảm ơn tuyệt vời rất nhiều – user462794

+0

Tôi đã có: Tệp "D: \ Documents \ perso \ dev \ meta \ Server.py", dòng 77, trong decompress_html với self.stdoutIO() là s: Thuộc tínhError: __exit__ – user462794

+0

@ user462794: Có vẻ như bạn đã bỏ qua dòng '@ contextlib.contextmanager' –

1

Cái gì như:

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

nên thực thi mã trong một quá trình khác nhau và ống đầu ra trở lại chương trình chính của bạn qua số codeproc.stdout. Nhưng tôi đã không trực tiếp sử dụng nó vì vậy nếu có điều gì đó tôi đã thực hiện sai cảm thấy tự do đến thời điểm nó ra: P

+0

tôi phải làm điều đó trong python chỉ:/cảm ơn cho câu trả lời – user462794

+0

nó là chỉ trong python: P – Blam

+0

tôi đã có một: codeproc = subprocess.Popen (lệnh, stdout = subprocess.PIPE) Tệp "C: \ DEV \ Python27 \ lib \ subprocess.py", dòng 672, trong __init__ errread, errwrite) Tệp "C: \ DEV \ Python27 \ lib \ subprocess.py ", dòng 882, trong _execute_child startupinfo) WindowsError: [Lỗi 2] Le fichier spécifié est introuvable (tệp không được tìm thấy bằng tiếng Pháp) – user462794

7

Bạn có thể chuyển hướng đầu ra tiêu chuẩn để một chuỗi trong suốt thời gian của cuộc gọi 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

Chỉ muốn thêm ghi chú để làm cho người bạn Python 3 này ly, bạn phải nhập 'StringIO' từ' io' => 'từ io nhập StringIO'. – idjaw

2

đây là Py3 thân thiện với phiên bản của @ câu trả lời Jochen của. Tôi cũng thêm mệnh đề try-except để khôi phục trong trường hợp có lỗi trong số 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

Đây là một sự điều chỉnh nhỏ về câu trả lời của Frédéric. Chúng tôi cần xử lý một ngoại lệ có thể có trong exec() để trả lại thông thường stdout. Nếu không chúng ta không thể nhìn thấy xa hơn print kết quả đầu ra:

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 
Các vấn đề liên quan