1

yadプログラム用のPythonインターフェイスを作成しました。コードが基本的に行うことは、 pythonsおよび/またはモジュールを使用してプログラムに渡される文字列を生成し、それを実行することですyadsubprocesspexpect

今、単純な[マルチ]プログレスバーを表示し、次のような特定の値でバーを更新しようとしている奇妙なバグに直面しています:

import yad, time

yad = yad.YAD()

x = yad.Progress(autoclose=True) # yad.MultiProgress(autoclose=True)

for i in range(0,105,5):
  print(i)
  x(i,msg=str(i)+"% done")
  time.sleep(0.5)

問題は、python 2.7 では正常に動作する (バーを更新し、病棟後に閉じる) ことですが、python 3.4 になると動作しません (バーを表示しますが、forループが出力されても更新されません)。数)。

私のインターフェースの問題が何であるかを理解しようとしています。関数は、バーを更新するように記述されていますが、何らかの理由で Python 3.4 では機能しません。

この問題で私を助けてください。バグがどこにあるのかわかりません。

Edit :xを呼び出したときに出力として返される関数ですyad.Progress()。を使用してx、いくつかの標準入力を yad に書き込むことができます。コードに相当するシェルは次のようになります。

yad --progress --auto-close
> 5
> # 5% done 
...
4

2 に答える 2

2

答えとして再投稿:

ラッパー モジュール内でp.stdin.flush()、サブプロセスの stdin に書き込んだ後に呼び出します。

Python 2 では、デフォルトで、バッファリングなしで Popen パイプを作成します (bufsize引数のsubprocess.Popenデフォルトは 0 です)。つまり、書き込んだデータはすぐにサブプロセスに送信されます。Python 3 では、バッファリングがデフォルトです (bufsizeデフォルトは -1 で、これはデフォルトのバッファ サイズを意味します)。そのため、パフォーマンス上の理由から、バッファがいっぱいになるかフラッシュを呼び出すまで、データはメモリに保存されます。

于 2016-02-18T14:17:39.880 に答える
0

を使用print("{}/100".format(k), "\r", end="")して、最後の % を非表示にしてから、更新された進行状況を印刷できます。

于 2016-02-18T04:04:45.143 に答える