2

外部プロセスを実行していて、テキストビューにプッシュできるようにすぐに標準出力を取得する必要があります。GNU/Linux では、「usePTY=True」を使用して標準出力を行ごとに取得できますが、残念ながら Windows では usePTY を使用できません。 .

私はツイストにかなり慣れていません。Windowsでツイスト(またはおそらくpython)の魔法のものを使用して同じ結果を達成する方法はありますか?

4

1 に答える 1

10

GNU/Linux では、「usePTY=True」を使用して標準出力を行ごとに取得できます

みたいな!実際に行うことは、退屈な古いパイプの代わりにusePTY=True、PTY(「疑似端末」-GNU / Linuxでシェルにログインするときに常に取得するものですが、実際の端末を持っている場合を除きます:) . PTY はパイプによく似ていますが、いくつかの追加機能があります。しかし、もっと重要なことは、PTY は対話型セッション (つまり、ユーザー) と強く関連しているのに対し、パイプはプログラムによる使用 (foo | barユーザーなしと考えてください) と非常に強く関連しているということです。の出力が表示されますfoo)。

これは、人々が PTY の存在を stdout として使用する傾向があることを意味します。これは、人間がそれを見るのを待っているためです。反対に、stdout としての通常の古いパイプの存在は、別のプログラムが出力を消費しているというシグナルと見なされ、代わりに可能な限り最も効率的な方法で出力を生成する必要があります。

これが実際に意味する傾向は、プログラムに PTY がある場合、その出力をライン バッファーし、パイプがある場合、その出力を "ブロック" バッファーすることです (通常、データを書き込む前に約 4kB のデータを収集します)。 ) - 行バッファリングの効率が悪いためです。

ここで注意すべきことは、このバッファリングを行うのは実行中のプログラムであるということです。usePTY=Trueそのバッファリングに直接の違いを与えるかどうかにusePTY=False関係なく、実行しているプログラムがどのような種類の出力バッファリングを行うべきかについてのヒントにすぎません。

これは、パスしてもバッファーをブロックするプログラムを実行する可能性があることを意味しusePTY=True、その逆も同様です。

ただし... Windows には PTY がありません。そのため、Windows 上のプログラムは、出力をバッファリングする方法のヒントとして PTY を考慮することができません。

プログラムがWindowsで尊重するのが慣例であるという別のヒントがあるかどうかは、実際にはわかりません。少なくとも、私は一度も遭遇したことがありません。

運が良ければ、実行中のプログラムには、行バッファ出力を要求する方法があります。Pythonを実行している場合は、PYTHONUNBUFFERED環境変数がこれを制御し、-uコマンドラインオプションも制御します(両方ともWindowsで動作すると思います)。

ちなみに、2 つのプロセス間でバイナリ データを渡す場合は、おそらく子プロセスでも stdio をバイナリ モードにする必要があります。

    import os, sys, mscvrt                                                                                                                  
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)                                                                                         
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)                                                                                        
    msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)           
于 2013-10-03T12:03:34.100 に答える