2009-02-26 12 views
3

Popenの同じ「セッション」で複数の呼び出しを行う方法はありますか?たとえば、コマンドを1つの長い文字列に連結しなくても、それを介してコールしたり、別のコールをコールしたりすることはできますか?Python persistent Popen

+2

"セッション"はこの文脈で何も意味しないので、あなたがしようとしていることを説明できますか?この質問は解析が難しく、多くの意味がないようです。あなたの目標が何であるかを説明すれば、おそらく助けになるでしょう。 –

答えて

3

あなたはpopenを使用しているときに実行ファイルを実行し、stdin、stdout、およびstderrで実行中です。実行ファイルが作業の "セッション"を行う何らかの方法を持っているなら(例えばstdinから行を読み込むことによって)、そうすることができます。それ以外の場合は、複数回実行する必要があります。

subprocess.Popenは(主に)ちょうどexecvpのラッパー(3)

+0

これは技術的に正しい代替ソリューションを提供するのではなく、実際のコンセプトを説明しています。 – Arafangion

+0

@Arafangion:「代替ソリューション」はどのように見えますか?私はその質問が何であるかを理解することはできません。唯一の答えはこれです - コンセプトが間違っています。 –

0

たとえば、コマンドを1つの長い文字列に連結しなくても、それを呼び出してから別のコマンドを呼び出すことはできますか?

あなたはshell = Trueを使用しているようですね。あなたが必要でない限り、しないでください。代わりにshell = False(デフォルト)を使用し、コマンド/ argリストを渡します。

Popenの同じ「セッション」で複数のコールを行う方法はありますか?たとえば、コマンドを1つの長い文字列に連結しなくても、それを介してコールしたり、別のコールをコールしたりすることはできますか?

2つのPopenインスタンスを作成し、必要に応じてそれぞれのインスタンスで待機/通信することはできません。私があなたを正しく理解すれば、これを行う通常の方法です。

+0

なぜshell = Trueを使用しないのですか? –

+0

@DavidDoriaはセキュリティ上の責任であるため、攻撃者がPopenへの入力に影響を及ぼすことができれば、コードを注入することができます。 (例えば、 "ls" + user_inputの実行は明らかに間違っています)。 shell = Falseはこれをすべて避けます。そのため、セキュリティプロパティはPopenで呼び出すプログラムに依存し、余分なものはありません。 –

1

あなたがシェルを実行し、それを複数のコマンドを送信(およびその出力を読む)できるようにしたいと仮定している、あなたが行うことができます表示されますこのような何か:

from subprocess import * 
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE) 

、例えば後,:

>>> p.stdin.write("cat /etc/motd\n") 
>>> p.stdout.readline() 
'Welcome to dev-linux.mongo.com.\n' 

(もちろん、あなたもstderrを確認するか、他のを尋ねるべき210をマージしてstdoutとマージします)。 1つのメジャー上記のの問題は、stdinstdoutのパイプがブロッキングモードになっているため、シェルからの出力が永久に "スタック"するのは簡単です。私はそれを試していませんが、これに対処する方法を示すActiveStateサイトにrecipeがあります。

更新:関連する質問/回答を見た後、それはそれだけで使用する方が簡単かもしれないように見えますPythonのビルトインselectモジュールそこのデータは、あなたがのために同じことを行うもすべきである(stdoutに読み取るためにかどうかを確認するためにstderr、もちろん):

>>> select.select([p.stdout], [], [], 0) 
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], []) 
+0

実際には、shell = Trueのコマンド( ';'で囲んで)を連結するよりも変わりません。元のポスターが何を示唆しているかを知ることができました。シェルの機能が必要でない限り、それはまだ悪いですが、これは表示されていません。より安全な選択肢があります。可能であれば –

+0

;それは疑問からは分かりません。しかし、何らかの理由で実際のユーザーとシェルの間の "プロキシ"として動作したい場合や、何らかのイベントなどに基づいてコマンドを定期的に送信したい場合、これを行うと便利かもしれません。たとえば、ActiveStateのレシピは、実際のユースケースに触発されているようです。 –

+0

私は完全に同意する、私はちょうどこのアドバイスでは必ずしも良いとは思わない。私は尋ねる者だけが知っていると思う。 –

関連する問題