2011-12-19 6 views
5

私の質問はthis oneに似ていますが、RPy経由でPythonにRをインポートするコンテキストでは、具体的には、私は私のPythonスクリプトの先頭にimport rpy quietly

from rpy import * 

実行したときに、私が実装したかった

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

で始まる画面(または出力デバイス)にダンプメッセージのチャンクが、そこにありますquiet_requireからhereまでですが、すべてモジュールのインポートのコンテキストにどのように適合するかはわかりません。

他のボックスで実行されている同じプログラムがメッセージを出力しないため、これが可能であることがわかりました。

更新:これはではありません。はPython内で解決する必要があります。何らかの理由でR側の変数を調整してすべての呼び出しを静かにすることができれば、それも機能します。私はちょうどそれを行う方法を知らない。ここで

+0

あなたの実際の質問とは関係ありませんが、 'from package import * 'を使用することは、グローバル名前空間を汚染するので、あまり避けてください。常にrpyと入力したくない場合は、 'import rpy as R'を使って短縮することができます。 – Wilduck

+0

Rを '--quiet'オプションで始める必要があります。 –

+0

'rpy'の代わりに' rpy2'を直接使うことができないのはなぜですか? – jcollado

答えて

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など変更されたコード。

+1

DummyFile()も 'open(os.devnull、" w ")'と置き換えることができますか?私はこのコンテキストマネージャのアプローチが好きです。 – jdi

+1

あなたは同様のソリューション[ここ](http://stackoverflow.com/q/8522689/183066)を見つけることができます。私の意見では、 'os.devnull'を使って' sys.__ stderr__'と 'sys .__ stdout__'を使って元の' sys.stderr'と 'sys.stdout'(値を保持する必要はありません)。 – jcollado

+0

@jdi、jcollado、あなたのアドバイスが好きです。改善されたコード。 – reclosedev