2011-01-14 3 views
4

私は、Qtを使用するアプリケーション用の対話的なPythonシェルで作業しています。しかし、私はリダイレクトするためのインタラクティブなヘルプを得ることができません。私は自分のPythonのコードでこれを持っている:Redirect python interactive help()

class OutputCatcher: 
    def __init__(self): 
     self.data = '' 
    def write(self, stuff): 
     self.data += stuff 

sys.stdout = OutputCatcher() 

しかし、これまで私が(ヘルプを実行したときに)それはちょうど私がからPythonスクリプトを実行したコンソールにそれをダンプし、対話型のヘルプをリダイレクトしません。コンソールでctrl + cを押すと、OutputCatcherオブジェクトに送信されます。

Googleを試しましたが、実際には何も見つかりませんでした。

+0

実行するコードはどのプラットフォームですか?現在のPythonインタプリタの内部でコンソールを実行する必要がありますか、またはサブプロセスを起動することは可能ですか? –

+0

プラットフォームはLinux、Windows、OSXなので、かなり多くのものがあります:) –

+0

OK、私の2番目の質問はどうですか?サブプロセスでPythonのインタラクティブなインタプリタを実行するのは現実的ですか?インタラクティブなインタプリタの内部から現在のインタプリタの変数にアクセスする必要がありますか? –

答えて

1

何が原因であるのかを推測する必要はありません。ソースを読むだけです。

helpの組み込み関数はsite.pyで作成され、クラス_Helperのインスタンスです。呼び出されると、単に呼び出しをpydoc.help(...)に委譲します。このソースはpydoc.pyにあります。

class _Helper(object): 
    """Define the built-in 'help'. 
    This is a wrapper around pydoc.help (with a twist). 

    """ 

    def __repr__(self): 
     return "Type help() for interactive help, " \ 
       "or help(object) for help about object." 
    def __call__(self, *args, **kwds): 
     import pydoc 
     return pydoc.help(*args, **kwds) 

pydoc.helpは、それが時点で標準入力/標準出力の値を使用しています(と私はあなたがあなたの問題を抱えているところ、これがある疑いがある)sys.stdinに設定された入力/出力とpydoc.Helpersys.stdoutのインスタンスですが、 pydocがインポートされるので、後で再バインドしても効果はありません。

組み込みのヘルプインスタンスを、必要なファイルを明示的に新しいpydocヘルパーを作成する独自の_Helperクラスで置き換えることをお勧めします。

1

ヘルプはstdoutにダンプするのではなく、端末とやりとりします。また、シェルの外で使用することは決してありませんので、そのようなことを保証するために書かれていないでしょう。

あなたがしようとしていることは、端末を実装することです。それは簡単な作業ですが、おそらくQtのための既存の端末エミュレーションライブラリがあります。おそらく、Pythonで書かれていて、確かにバインディングで書かれています。

+0

'python -c" help() "'> file'は私のために 'file'へのヘルプをダンプします - それでstdoutとやりとりするようです。 'sys.stdout'は使用しませんが、これを回避することができます。私はちょうどネーサンが私の質問に答えるのを待っています:) –