4

私はこのやや複雑なコマンド ライン関数を Python で使用しており (これを と呼びましょうmyFunction())、グラフィカル インターフェイス (PySide/Qt を使用) に統合する作業を行っています。

GUI は、入力の選択と出力の表示に役立ちます。ただし、myFunctionスタンドアロンのコマンド ライン機能として動作するように設計されており、進行状況を出力することがあります。

私の質問は、これらのprint呼び出しを傍受して GUI に表示するにはどうすればよいですか? myFunction()GUIに送信するように変更できることはわかっていますが、端末でprocessEvents()実行する機能が失われます。myFunction()

理想的には、Ubuntu のグラフィカル ソフトウェア アップデーターに似たものapt-getが欲しいです。これには、ターミナルで実行された場合に表示されるものを表示する小さなターミナルのようなウィジェットが埋め込まれています。

4

4 に答える 4

8

stdout をリダイレクトして、後で復元することができます。例えば:

import StringIO
import sys

# somewhere to store output
out = StringIO.StringIO()

# set stdout to our StringIO instance
sys.stdout = out

# print something (nothing will print)
print 'herp derp'

# restore stdout so we can really print (__stdout__ stores the original stdout)
sys.stdout = sys.__stdout__

# print the stored value from previous print
print out.getvalue()
于 2013-06-12T14:13:39.450 に答える
2

stdout をハイジャックする関数でラップします。

def stdin2file(func, file):
  def innerfunc(*args, **kwargs):
    old = sys.stdout
    sys.stdout = file
    try:
      return func(*args, **kwargs)
    finally:
      sys.stdout = old
  return innerfunc

次に、以下をサポートするファイルのようなオブジェクトを提供するだけですwrite()

class GUIWriter:
  def write(self, stuff):
    #send stuff to GUI

MyFunction = stdin2file(MyFunction, GUIWriter())

ラッパーもデコレーターに変えることができます:

def redirect_stdin(file):
  def stdin2file(func, file):
    def innerfunc(*args, **kwargs):
      old = sys.stdout
      sys.stdout = file
      try:
        return func(*args, **kwargs)
      finally:
        sys.stdout = old
    return innerfunc
  return stdin2file

宣言するときに使用しますMyFunction()

@redirect_stdin(GUIWriter())
def MyFunction(a, b, c, d):
  # any calls to print will call the 'write' method of the GUIWriter
  # do stuff
于 2013-06-12T14:15:31.840 に答える
1

すべての印刷はsys.stdout、通常のファイルのようなオブジェクトである を介して行われます: iirc。メソッドが必要write(str)です。置換にそのメソッドがある限り、フックをドロップするのは非常に簡単です。

import sys

class CaptureOutput:
    def write(self, message):
        log_message_to_textbox(message)

sys.stdout = CaptureOutput()

実際の内容はlog_message_to_textboxあなた次第です。

于 2013-06-12T14:10:59.167 に答える
1

次に示すのは、コンテキスト マネージャーを使用した Python 3 パターンです。これは、モンキー パッチ手法をカプセル化し、例外が発生した場合に確実にsys.stdout復元されるようにします。

from io import StringIO
import sys
from contextlib import contextmanager


@contextmanager
def capture_stdout():
    """
    context manager encapsulating a pattern for capturing stdout writes
    and restoring sys.stdout even upon exceptions

    Examples:
    >>> with capture_stdout() as get_value:
    >>>     print("here is a print")
    >>>     captured = get_value()
    >>> print('Gotcha: ' + captured)

    >>> with capture_stdout() as get_value:
    >>>     print("here is a print")
    >>>     raise Exception('oh no!')
    >>> print('Does printing still work?')
    """
    # Redirect sys.stdout
    out = StringIO()
    sys.stdout = out
    # Yield a method clients can use to obtain the value
    try:
        yield out.getvalue
    finally:
        # Restore the normal stdout
        sys.stdout = sys.__stdout__
于 2018-03-09T16:17:14.260 に答える