2011-12-19 10 views
5

La mia domanda è analoga a this one ma nel contesto dell'importazione di R in Python tramite RPy. In particolare, quando corroimportazione quietamente

from rpy import * 

all'inizio del mio script python, c'è un pezzo di messaggio scaricato al (o dispositivo di uscita) dello schermo, a partire

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

ho voluto realizzare il quiet_require da here ma non si vede come si adatta nel contesto dell'importazione di tutti i moduli.

So che questo è possibile perché lo stesso programma in esecuzione su un'altra casella non emette alcun messaggio.

AGGIORNAMENTO: questo non deve essere risolto in Python. Se posso in qualche modo modificare una variabile sul lato R per consentire a tutte le invocazioni di essere silenziose, funziona anche. Solo non so come farlo.

+0

Non correlato alla domanda attuale, ma l'uso di 'from package import *' è altamente sconsigliato poiché inquina lo spazio dei nomi globale. Se non vuoi digitare sempre rpy, puoi accorciarlo con 'import rpy as R'. – Wilduck

+0

È necessario ottenere R per iniziare con l'opzione '--quiet'. –

+0

Posso chiederti perché non puoi usare 'rpy2' direttamente invece di' rpy'? – jcollado

risposta

8

è semplice, ma non mod bella:

# 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 

edit: codice modificato come @jdi consigliato e @jcollado.

+1

Potrebbe anche essere sostituito DummyFile() con: 'open (os.devnull," w ")'? Mi piace questo approccio contextmanager BTW – jdi

+1

Puoi trovare soluzioni simili [qui] (http://stackoverflow.com/q/8522689/183066). Ci sono alcune modifiche che renderebbero il codice ancora migliore a mio parere: usando 'os.devnull' e usando' sys .__ stderr__' e 'sys .__ stdout__' per ottenere l'originale' sys.stderr' e 'sys.stdout' (non c'è bisogno di mantenere i valori). – jcollado

+0

@jdi, jcollado, mi piacciono i tuoi consigli. Aggiunti miglioramenti al codice. – reclosedev