2

私が書いているPyQt GUIアプリで単純な(Windows)コマンドラインツールをラップして実行しようとしています。私が抱えている問題は、コマンドラインツールが進行状況をstdoutにスローすることです(これはサーバーリセットコマンドであるため、「停止しようとしています」および「再起動中」タイプの出力が得られます.

私がやろうとしているのは、出力をキャプチャして、アプリの一部として表示できるようにすることです。次のようなことを行うのは非常に簡単だと思いました:

import os
import subprocess as sub
cmd = "COMMAND LINE APP NAME -ARGS"
proc = sub.Popen(cmd, shell=True, stdout=sub.PIPE).stdout
while 1:
    line = proc.readline()
    if not line: 
        break
print line

これは、StdOut の内容を取得するという点で部分的に機能しますが、進行状況メッセージが送信される代わりに、コマンド ライン アプリケーションが終了するとそれを取得し、StdOut を一度にフラッシュするように見えます。

簡単な答えはありますか?

4

2 に答える 2

1

stdin/stdout を介した対話型通信は、よくある問題です。

ここで説明されているように、PyQt では QProcess を使用できます: http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process

于 2009-07-20T07:47:39.057 に答える
0

質問を理解できますか?あなたは「エコーファースト、スリープ60、エコーセカンド」のようなものを実行していて、「セカンド」のかなり前に「ファースト」を見たいと思っていますが、両方が同時に吐き出されています。

問題が発生している理由は、オペレーティングシステムがプロセスの出力をメモリに保存しているためです。バッファがいっぱいになった場合、または他のプログラムが終了した場合にのみ、出力をプログラムに送信する手間がかかります。ですから、O / Sを掘り下げて、「ねえ、それをちょうだい!」と言う方法を理解する必要があります。これは一般に非同期モードまたは非ブロッキングモードとして知られています。

幸いなことに、誰かが私たちのために大変な仕事をしてくれました。この男は、Pythonの組み込みPopenクラスにsend()メソッドとrecv()メソッドを追加しました。また、コメントで見つかったバグを修正したようです。

試してみてください:http: //code.activestate.com/recipes/440554/

于 2009-07-29T05:07:16.817 に答える