【问题标题】:import rpy quietly悄悄地导入rpy
【发布时间】:2012-01-23 18:49:47
【问题描述】:

我的问题类似于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 端的变量以允许所有调用保持安静,那也可以。我只是不知道该怎么做。

【问题讨论】:

  • 与您的实际问题无关,但强烈建议不要使用 from package import *,因为它会污染全局命名空间。如果您不想一直输入 rpy,可以使用 import rpy as R 缩短它。
  • 你需要让 R 以 --quiet 选项开始。
  • 请问您为什么不能直接使用rpy2 而不是rpy
  • @Richie Cotton,是的,这也可以。但是怎么做呢?
  • @jcollado,我无法完全控制该盒子上安装的内容。

标签: python r rpy2


【解决方案1】:

这里是简单但不漂亮的 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 的建议更改了代码。

【讨论】:

  • DummyFile() 也可以替换为:open(os.devnull, "w") 吗?我喜欢这种上下文管理器方法顺便说一句
  • 你可以找到类似的解决方案here。在我看来,有一些更改会使代码变得更好:使用os.devnull 并使用sys.__stderr__sys.__stdout__ 来获得原始的sys.stderrsys.stdout(无需保留这些值)。跨度>
  • @jdi,jcollado,我喜欢你的建议。添加了对代码的改进。
猜你喜欢
  • 2015-02-14
  • 2019-02-17
  • 2018-03-26
  • 2019-11-22
  • 2015-11-26
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多