0

これがアイデアです。app1とapp2を(サブプロセスを使用して)開始する「メイン」のPythonスクリプトがあります。'main'スクリプトは、入力をapp1に送信し、結果をapp2に送信します(その逆も同様です)(メインスクリプトは、送信された内容を記憶する必要があるため、app1からapp2にパイプを送信できません)。

これがメインスクリプトです。

import subprocess
import time

def main():
    prvi = subprocess.Popen(['python', 'random1.py'], stdin = subprocess.PIPE , stdout = subprocess.PIPE, stderr = subprocess.STDOUT)

    while 1:
        prvi.stdin.write('131231\n')
        time.sleep(1) # maybe it needs to wait
        print "procitano", prvi.stdout.read()

if __name__ == '__main__':
    main()

そしてこれは「random1.py」ファイルです。

import random

def main():
    while 1:
        inp = raw_input()
        print inp, random.random()
if __name__ == '__main__':
    main()

最初に、それが機能しているかどうかを確認するために、1つのサブプロセスだけで試しました。そして、そうではありません。'procitano'のみを出力し、そこで待機します。'prvi'からの出力を読み取るにはどうすればよいですか(communicate(を使用せずに)。これを使用すると、アプリが終了しますが、これは望ましくありません)。

4

3 に答える 3

2

prvi.stdin.flush()の後に追加しprvi.stdin.write(...)ます。

説明:プロセス間の通信を最適化するために、OSは4KBのデータをバッファリングしてから、そのバッファ全体を他のプロセスに送信します。送信するデータが少ない場合は、OSに「それだけです。今すぐ送信してください」と伝える必要があります->flush()

[編集]次の問題はprvi.stdout.read()、子供が出てこないので二度と戻らないということです。

プロセス間でプロトコルを開発する必要があります。これにより、プロセスは、何かを取得したときに読み取るデータのバイト数を知ることができます。簡単な解決策は、行ベースのプロトコルを使用することです(各「メッセージ」は新しい行で終了します)。これを行うには、を置き換えread()て、送信するすべてのものreadline()に追加することを忘れないでください\n+flush()

于 2012-08-02T09:15:45.490 に答える
1
  • フラグを使用-uしてrandom1.py出力をバッファなしにします
  • .read()の代わりにp.stdout.readline()を使用します

.readブロックがあるため、time.sleepは不要です。

于 2012-08-04T10:56:37.783 に答える
1

main.py

import subprocess
import time

def main():
    prvi = subprocess.Popen(['python', 'random1.py'], stdin = subprocess.PIPE , stdout = subprocess.PIPE, stderr = subprocess.STDOUT)


    prvi.stdin.write('131231\n')
    time.sleep(1) # maybe it needs to wait
    print "procitano", prvi.stdout.read()

if __name__ == '__main__':
    main()

random1.py

import random

def main():

    inp = raw_input()
    print inp, random.random()
    inp = raw_input()

if __name__ == '__main__':
    main()

上記のコードでテストしたところ、あなたのコードと同じ問題が発生しました。問題はタイミングだと思います。これが私の推測です、main.pyが以下のコードを試すとき

prvi.stdout.read()  # i think this code may use the random1.py process

以下のコードはrandom1.pyプロセスを取得します

inp = raw_input()

この問題を解決するには、Aaron Digullaが言うように、それを作成するためのプロトコルを開発する必要があると思います。

于 2012-08-04T09:17:19.230 に答える