2011-12-19 60 views
5

我的問題類似於this one,但在通過RPy將R導入Python的上下文中。特別是,當我運行悄悄地導入rpy

from rpy import * 

在我的Python腳本的開頭,有轉儲到屏幕(或輸出設備),消息一大塊,從

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

我想要實現的quiet_requirehere,但沒有看到它是如何適合導入所有模塊的上下文。

我知道這是可能的,因爲在另一個盒子上運行的相同程序不會輸出任何消息。

更新:這是而不是必須在Python中解決。如果我能以某種方式調整R方面的變量以允許所有的調用安靜,那也可以。我只是不知道該怎麼做。

+0

與您的實際問題無關,但它使用'from package import *'非常不鼓勵,因爲它會污染全局名稱空間。如果你不想一直輸入rpy,可以用'import rpy as R'來縮短它。 – Wilduck 2011-12-19 17:06:39

+0

你需要讓R開始使用'--quiet'選項。 – 2011-12-19 17:24:03

+0

請問爲什麼你不能直接使用'rpy2'而不是'rpy'? – jcollado 2011-12-19 19:35:58

回答

8

下面是簡單的,但不美麗黑客:

# 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 

編輯:改變代碼勸@jdi和@jcollado。

+1

DummyFile()也可以替換爲:'open(os.devnull,「w」)'?我喜歡這種上下文管理方法BTW – jdi 2011-12-19 17:33:42

+1

你可以在這裏找到類似的解決方案(http://stackoverflow.com/q/8522689/183066)。在我看來,有些更改會使代碼變得更好:使用'os.devnull'並使用'sys .__ stderr__'和'sys .__ stdout__'來獲取原始的'sys.stderr'和'sys.stdout'(不需要保留這些值)。 – jcollado 2011-12-19 17:34:40

+0

@jdi,jcollado,我喜歡你的建議。增加了對代碼的改進。 – reclosedev 2011-12-19 17:58:19