2

こんにちは、Python サブプロセス モジュールについて質問があります

子プロセスとやり取りしたい(例:子の標準入力、標準出力)

これは子プログラムのコードです

  1 #include <stdio.h>
  2 
  3 int main(){
  4         char buf[1024];
  5         printf("asdfsadfasff\n");
  6         scanf("%s",buf);
  7         printf("%s\n",buf);
  8 }

このコードは非常に単純で、文字列を出力し、入力を待機し、入力文字列を出力します

次に、Pythonコードは以下のとおりです

  1 #!/usr/bin/python
  2 from subprocess import *
  3 
  4 fd = Popen(["./random"],stdin=PIPE,stdout=PIPE)
  5 print "pid = %d"%(fd.pid) # print pid
  6 result = ""
  7 result = fd.stdout.read(-1) # read
  8 print result
  9 fd.stdin.write("write write write!!!\n")
 10 result = fd.stdout.read(-1)
 11 print result

この場合、このプログラムがうまく動作することを期待していましたが、7 行目 (fd.stdout.read(-1) がブロックされ、動作しませんでした)

読み取り関数のパラメーター (read(-1)、read(1)、read()、read(1024)) を変更しましたが、すべてが機能しません

しかし、最初に標準入力で文字列を指定すると、プログラムは機能しました。

プログラムが終了したときに、子供の標準出力バッファがいっぱいではなかったと思います...これは私の意見です

この問題に関する解決策はありますか?

編集1。最初に文字列を出力するプログラムを実行し、「sudo su」などのユーザーの入力を待つと、これは期待どおりに機能しました

このケースがうまく機能する理由がわかりません

  1 from subprocess import *
  2 
  3 fd = Popen(["sudo","su"],stdin=PIPE,stdout=PIPE)
  4 
  5 print fd.stdout.read(-1)
  6 print fd.stdin.write("asdfasdfas\n")
4

1 に答える 1

5

子プロセス./randomは を使用しstdioています。これは、プロセスの stdout が tty デバイスでない場合、デフォルトで「ライン バッファリング」ではなく「フル バッファリング」を行います。scanfPython はパイプ (tty デバイスではない) を介してプロセスを実行するため、プログラムはその出力をバッファリングし、呼び出し時に出力しません。バッファーは、(a) いっぱいになった場合にのみフラッシュ (stdout に書き込まれます) されます。(b) 呼び出しで明示的にフラッシュされたときfflush。または (c) プログラムの終了時。

明示的な呼び出しを行うように子プロセスを変更するかfflush、Python の疑似 tty を使用することができます。(モジュールはデフォルトで出力のみに pty を使用しますが、通常はこれで十分であることに注意してください。) または、実行しているプログラムが「インタラクティブに見える」(しかし実際には完全に予測可能である) だけの場合は、実行するだけです。既知の入力シーケンスが事前に提供されています。pexpectshsh

fd = Popen(["./random"], stdin=PIPE, stdout=PIPE)
result = fd.communicate("write write write!!!\n")[0]

ただし、もちろん、すべての stdout 入力が混合され、出力された 2 行を分離する必要があります (この場合)。

于 2012-05-15T19:27:13.897 に答える