导入rpy模块并保持安静

5

我的问题类似于这个问题,但是在通过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
... ...

我想实现这里quiet_require,但不知道如何在导入所有模块的情况下使用它。
我知道这是可能的,因为在另一台计算机上运行相同的程序时不会输出任何消息。
更新:这个问题不一定要在Python中解决。如果我能够在R端调整变量以允许所有调用都保持安静,那也可以。我只是不知道该怎么做。

与您实际问题无关,但是使用 from package import * 是不被推荐的,因为它会污染全局命名空间。如果您不想一直输入 rpy,可以使用 import rpy as R 进行缩写。 - Wilduck
你需要使用 --quiet 选项启动 R。 - Richie Cotton
我可以问一下为什么不能直接使用rpy2而不是rpy吗? - jcollado
@Richie Cotton,是的,那也可以。但是怎么做呢? - Zhang18
@jcollado,我无法完全控制安装在那个盒子上的内容。 - Zhang18
1个回答

8

这里是一个简单但不漂亮的 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 

修改:根据@jdi和@jcollado的建议更改了代码。


1
DummyFile() 可以被替换为 open(os.devnull, "w") 吗?顺便说一句,我喜欢这种上下文管理器的方法。 - jdi
1
你可以在这里找到类似的解决方案:https://dev59.com/kWoy5IYBdhLWcg3wfOB4。在我看来,有一些改进可以使代码更好:使用`os.devnull`,并使用`sys.__stderr__`和`sys.__stdout__`来获取原始的`sys.stderr`和`sys.stdout`(不需要保留值)。 - jcollado
@jdi,jcollado,我喜欢你们的建议。对代码进行了改进。 - reclosedev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接