0
def findStats():
     thread1 = thread.start_new_thread(func1, (arg_1, arg_2))
     thread2 = thread.start_new_thread(func2, (arg_3, arg_4))

def func1(arg_1, arg_2):
     """
        Some code which prints some stuff
     """

def func2(arg_3, arg_4):
     """ 
        Some code which prints some other stuff
     """

ここでやりたいことは、func1 と func2 からの印刷出力を 2 つの別個の文字列にキャプチャして、GUI の 2 つの異なるタブに表示するために使用できるようにすることです。

また、StringIO() を使用してみましたが、それらは並列実行スレッドであるため、出力シーケンスは明らかにめちゃくちゃです。使用するサブプロセスについて学んでいますが、方法がわかりません..まだ試しています。

それはできますか?もしそうなら、私に方法を教えてください。前もって感謝します :)

4

3 に答える 3

1

python の logging モジュールを使用します。これにより、アクセスのシリアル化が処理され、各ログのレベルを設定できます。メッセージのタイム スタンプは、ログ識別子と共に必要になる場合があります。

ここにリンクしてくださいhttp://docs.python.org/howto/logging.html

于 2012-07-12T06:46:36.930 に答える
0

StringIO() を使用してみましたが、並列実行スレッドであるため、出力シーケンスが明らかに混乱しています。

このメソッドが機能しているので、そのまま使用できます。スレッドごとsys.stdoutに個別のオブジェクトにリダイレクトします。StringIO最初のスレッドを作成する前に一度リダイレクトします。StringIO次に、2 番目のスレッドを作成する前に別のオブジェクトにリダイレクトします。関数findStatsはこれらすべてを実行でき、2 つの文字列バッファーをタプルとして返す必要があります。

于 2012-07-12T18:26:07.963 に答える
0
  import sys
  from cStringIO import StringIO
  from multiprocessing import Process, Queue

  def mp():
      queue = Queue()
      p = Process(target=loop,args=('lo','op'))
      q = Process(target=doop,args=('do','op'))
      p.start()
      q.start()
      p.join()
      q.join()

  def loop(p,x):
      old_stdout = sys.stdout  # Redirection of the printing output to a StringIO
      sys.stdout = mystdout = StringIO()
      for i in xrange(100):
          print p + x
      ### Write the code\functions necessary in here. ###
      sys.stdout = old_stdout
      dataStats_1 = mystdout.getvalue()    # Put all the redirected output into a string.

  def doop(q,y):
      old_stdout = sys.stdout   # Redirection of the printing output to a StringIO() 
      sys.stdout = mystdout = StringIO()
      for i in xrange(100):
          print q+y
      ### Write the code\functions necessary in here. ###
      sys.stdout = old_stdout
      dataStats_2 = mystdout.getvalue()                      

  if __name__ == "__main__":
      mp()

したがって、各 dataStats_1 および dataStats_2 変数には、関数「doop」および「loop」からの出力が含まれます。

この上記の方法がどれほど本物かはわかりません。しかし、これは実際に私にとってはうまくいきます。

また、プロセスの代わりにスレッドを使用しようとすると、印刷出力を StringIO にリダイレクトするこの方法は機能しません。スレッドは親の I/O ソースを継承し、特定のスレッドでそれを変更すると変更されるためです。親スレッドにも。ただし、子プロセスの場合、親の I/O ソースに干渉しません。だから、これはうまくいきます。

于 2012-07-12T12:26:34.590 に答える