2017-07-28 13 views
0

私はユーザーからの入力を受け入れるpython 3スクリプトを持っています。この入力はシェルが生成されたサブプロセスにパイプされます。もともと私はこのコードをソケットと一緒に置くつもりだったが、私のレベルではそれほど難しいものではなかった。コード:通信なしでpythonサブプロセスstdoutを読む方法

import subprocess 

p1 = subprocess.Popen(["/bin/sh"], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf-8") 

command = input("Command: ") 

p1.stdin.write(command) 

p1.stdout.read() 

問題:何もプリントアウトされなかっます。私は無限の時間 をオンラインで検索しましたが、理由は何度かありますが、それらのすべては のようには見えません。私が ソケットでこれを実装できるかどうかを考えると、各コマンドの後にプロセスを終了することはできません。私は も書き込む前に、どこにでもフラッシュを試して、 の後に、あなたが考えることができるほとんどどこでも読んで、読んでいます。それは私がioモジュールまたはルール (遅すぎる)の深くを見なければならず、簡単に でなければなりません。私はこの日の終わりに の間これと闘ってきました。

+0

ようこそスタックオーバーフロー!コードブロックを投稿するときは、各行の先頭に4つのスペースを追加して、コードスニペットとして表示させてください。投稿の書式設定の詳細については、ヘルプセンターの[編集ヘルプ](// stackoverflow.com/editing-help)を参照してください。 –

答えて

0

あなたはいくつかの問題がありますが、私は道を描こうとします。私はあなたを誤解していないことを願っています。

最初に、免責事項:ユーザー入力を実行することは、本質的に安全ではありません。これが問題でない場合は、問題を継続しましょう。私はラインバッファリングPIPEを持つ

p1 = subprocess.Popen(["/bin/sh"], stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, bufsize=1) 

を行うことによって開始する

は、このシナリオでは、良いアイデアです。その後

、あなたはそう、コマンドの後にEnterキーを押しする必要があることを覚えて:

command = input("Command: ") + "\n" 

書き込みは、正しい

p1.stdin.write(command) 

しかし、読み取りは非常に危険であり、あなたは自明だろうデッドロック状態になるstdoutが公開されているので(EOFなどはない)、あなたは慎重に読むべきですが、それでも問題はあります。あなたはそれが問題だ...あなたが読むことができますどのように多くの行がわからない場合は、

p1.stdout.readline() 

しかし:

最初のアイデアは、ラインを読むことであろう。実際には、その特定の問題has already been asked

実験したい場合は、インタラクティブなPythonインタプリタを開き、"ls\n"コマンドを送信し、readline()を実行します。あなたが最後の行を読むまで、それは働きます。そして、それは永遠に待つでしょう。それは悪い行為です。だからあなたはそれを解決する必要があります。

関連する問題