2011-12-19 19 views
5

Câu hỏi của tôi tương tự như this one nhưng trong ngữ cảnh nhập R sang Python qua RPy. Cụ thể, khi tôi chạynhập rpy lặng lẽ

from rpy import * 

vào đầu script python của tôi, có một đoạn thông điệp đổ vào màn hình (hoặc thiết bị đầu ra), bắt đầu với

Parsing output: R version 2.13.2 (2011-09-30) 
Copyright (C) 2011 The R Foundation for Statistical Computing 
... ... 

tôi muốn thực hiện quiet_require từ here nhưng không thấy nó phù hợp như thế nào trong ngữ cảnh nhập tất cả các mô-đun.

Tôi biết điều này là có thể vì cùng một chương trình đang chạy trên một hộp khác không xuất ra bất kỳ thông báo nào.

CẬP NHẬT: điều này không không phải phải được giải quyết trong Python. Nếu tôi bằng cách nào đó có thể tinh chỉnh một biến ở phía R để cho phép tất cả các lời gọi được giữ im lặng, điều đó cũng hoạt động. Tôi chỉ không biết làm thế nào để làm điều đó.

+0

Không liên quan đến câu hỏi thực tế của bạn, nhưng nó sử dụng 'từ gói nhập *' được đánh giá cao vì nó gây ô nhiễm không gian tên chung. Nếu bạn không muốn gõ rpy mọi lúc, bạn có thể rút ngắn nó bằng 'import rpy as R'. – Wilduck

+0

Bạn cần có R để bắt đầu với tùy chọn '--quiet'. –

+0

Tôi có thể hỏi tại sao bạn không thể sử dụng 'rpy2' trực tiếp thay vì' rpy'? – jcollado

Trả lời

8

Đây là đơn giản nhưng không xinh đẹp hack:

# define somewhere following: 
import sys 
import os 
from contextlib import contextmanager 

@contextmanager 
def quiet(): 
    sys.stdout = sys.stderr = open(os.devnull, "w") 
    try: 
     yield 
    finally: 
     sys.stdout = sys.__stdout__ 
     sys.stderr = sys.__stderr__ 


# use it  
with quiet(): 
    # all is quiet in this scope 
    import this # just for testing 
    from rpy import * # or whatever you want 
# and this will print something 
import something_that_prints 

chỉnh sửa: đang thay đổi như @jdi khuyên và @jcollado.

+1

DummyFile() cũng có thể được thay thế bằng: 'open (os.devnull," w ")'? Tôi thích cách tiếp cận ngữ cảnh này BTW – jdi

+1

Bạn có thể tìm thấy các giải pháp tương tự [tại đây] (http://stackoverflow.com/q/8522689/183066). Có một số thay đổi sẽ làm cho mã tốt hơn theo ý kiến ​​của tôi: sử dụng 'os.devnull' và sử dụng' sys .__ stderr__' và 'sys .__ stdout__' để lấy' sys.stderr' và 'sys.stdout' gốc (không cần phải giữ các giá trị). – jcollado

+0

@jdi, jcollado, tôi thích lời khuyên của bạn. Đã thêm các cải tiến cho mã. – reclosedev