2011-12-19 64 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