悄悄地进口rpy

时间:2011-12-19 17:00:06

标签: python r rpy2

我的问题类似于this one,但是在通过RPy将R导入Python的上下文中。具体来说,当我运行

from rpy import *

在我的python脚本的开头,有一大块消息被转储到屏幕(或输出设备),从

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

我想从here实施quiet_require,但是在导入所有模块的上下文中看不出它是如何适合的。

我知道这是可能的,因为在另一个盒子上运行的相同程序不会输出任何消息。

更新:必须在Python中解决。如果我能以某种方式调整R端的变量以允许所有调用都是安静的,那也是有效的。我只是不知道该怎么做。

1 个答案:

答案 0 :(得分: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的建议更改了代码。