2011-12-19 14 views
5

Mi pregunta es análoga a this one pero en el contexto de la importación de R a Python a través de RPy. En concreto, cuando corroimport rpy quietly

from rpy import * 

al comienzo de mi script en Python, hay un trozo de mensaje de vertido a la pantalla (o de salida), a partir de

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

quería poner en práctica el quiet_require desde here pero no veo cómo encaja en el contexto de la importación todos los módulos.

Sé que esto es posible porque el mismo programa que se ejecuta en otro cuadro no muestra ningún mensaje.

ACTUALIZACIÓN: esto hace no tiene que ser resuelto dentro de Python. Si de alguna manera puedo ajustar una variable en el lado R para permitir que todas las invocaciones sean silenciosas, eso también funciona. Simplemente no sé cómo hacer eso.

+0

No se relaciona con su pregunta real, pero se usa 'from package import *', ya que contamina el espacio de nombres global. Si no quiere escribir rpy todo el tiempo, puede acortarlo con 'import rpy como R'. – Wilduck

+0

Necesita obtener R para comenzar con la opción '--quiet'. –

+0

¿Puedo preguntar por qué no puedes usar 'rpy2' directamente en lugar de' rpy'? – jcollado

Respuesta

8

aquí es simple, pero no corte hermosa:

# 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 

edición: código modificado como @jdi asesorado y @jcollado.

+1

¿Podría DummyFile() también ser reemplazado por: 'open (os.devnull," w ")'? Me gusta este enfoque contextmanager BTW – jdi

+1

Puede encontrar soluciones similares [aquí] (http://stackoverflow.com/q/8522689/183066). Hay algunos cambios que mejorarían el código en mi opinión: usando 'os.devnull' y usando' sys .__ stderr__' y 'sys .__ stdout__' para obtener' sys.stderr' y 'sys.stdout' originales (no es necesario mantener los valores). – jcollado

+0

@jdi, jcollado, me gustan tus consejos. Mejoras añadidas al código. – reclosedev