0

プログラムが実行されなくなったため、サブプロセスを使用してこのプログラムを実行しinputたい...raw_input()

while True: print raw_input()

そしてその出力を取得します。

これは私の読書プログラムとして持っているものです:

import subprocess
process = subprocess.Popen('python subinput.py', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
while True:
    output=process.stdout.read(12)
    if output=='' and process.poll()!=None:
        break
    if output!='':
        sys.stdout.write(output)
        sys.stdout.flush()

これを実行すると、サブプロセスは開始とほぼ同じ速さで終了します。どうすればこれを修正できますか?

4

3 に答える 3

1

この方法ではうまくいかないのではないかと心配しています。

あなたは、それがあなたのコンソールを接続すると仮定しsubprocessます(あなたの特別なケースstdin)。これは機能しません。モジュールには、それを指定するための 2 つのオプションしかありません:PIPESTDOUT.

何も指定されていない場合、サブプロセスは対応するストリームを使用できません。出力はどこにも行かないか、入力を受け取りません。raw_input()EOFのため終了します。

進むべき道は、「メイン」プログラムで入力を行い、サブプロセスで作業を行うことです。

編集:

ここに例がありますmultiprocessing

from multiprocessing import Process, Pipe
import time

def child(conn):
    while True:
        print "Processing..."
        time.sleep(1)
        if conn.poll(0):
            output = conn.recv()
            print output
        else:
            print "I got nothing this time"

def parent():
    parent_conn, child_conn = Pipe()
    p = Process(target=child, args=(child_conn,))
    p.start()
    while True:
        data = raw_input()
        parent_conn.send(data)
    # p.join() - you have to find some way to stop all this...
    # like a specific message to quit etc.


if __name__ == '__main__':
    parent()

もちろん、この連携を止める方法を見つけて、より堅牢にする必要があります。私の例では、両方のプロセスが同じファイルにありますが、別の方法で編成することもできます。

この例は Linux で動作します。Windows のパイプで問題が発生する可能性がありますが、完全に解決できるはずです。

「処理」は、親からのデータを待つだけでなく、何か他のことをしたい部分です。

于 2012-06-11T04:38:06.483 に答える
1

stdout問題は、サブプロセスがandstdinに直接接続されていないため、キーボード入力を受け取ることができないことだと思います。おそらく raw_input() が例外をスローしています。

これが実験ではなく実際的な問題である場合は、curses や pygame などのライブラリを使用して入力を処理することをお勧めします。実験していて自分でやりたい場合は、サブプロセスではなくスレッドを調べる必要があると思いますが、これはかなり複雑なことなので、他の問題に遭遇することは確実です.

于 2012-06-11T04:30:21.997 に答える
0

さて、別のアーキテクチャを試してみてください。使用できますzeromq

  1. Producer はすべてのアイテム (ここでは stdout 経由で送信される出力) を生成し、 経由でブロードキャストしzmqます。

  2. コンシューマーは、プロデューサーによってブロードキャストされているポート番号をリッスンし、それに応じて処理する必要があります。

ここに例があります http://code.saghul.net/implementing-a-pubsub-based-application-with

Note

geventまたはを使用multiprocessingして、これらのプロセスを生成します。

master産卵を処理するプログラムがありproducerconsumer

于 2012-06-11T06:30:31.490 に答える