Popenの同じ「セッション」で複数の呼び出しを行う方法はありますか?たとえば、コマンドを1つの長い文字列に連結しなくても、それを介してコールしたり、別のコールをコールしたりすることはできますか?Python persistent Popen
答えて
あなたはpopenを使用しているときに実行ファイルを実行し、stdin、stdout、およびstderrで実行中です。実行ファイルが作業の "セッション"を行う何らかの方法を持っているなら(例えばstdinから行を読み込むことによって)、そうすることができます。それ以外の場合は、複数回実行する必要があります。
subprocess.Popenは(主に)ちょうどexecvpのラッパー(3)
これは技術的に正しい代替ソリューションを提供するのではなく、実際のコンセプトを説明しています。 – Arafangion
@Arafangion:「代替ソリューション」はどのように見えますか?私はその質問が何であるかを理解することはできません。唯一の答えはこれです - コンセプトが間違っています。 –
たとえば、コマンドを1つの長い文字列に連結しなくても、それを呼び出してから別のコマンドを呼び出すことはできますか?
あなたはshell = Trueを使用しているようですね。あなたが必要でない限り、しないでください。代わりにshell = False(デフォルト)を使用し、コマンド/ argリストを渡します。
Popenの同じ「セッション」で複数のコールを行う方法はありますか?たとえば、コマンドを1つの長い文字列に連結しなくても、それを介してコールしたり、別のコールをコールしたりすることはできますか?
2つのPopenインスタンスを作成し、必要に応じてそれぞれのインスタンスで待機/通信することはできません。私があなたを正しく理解すれば、これを行う通常の方法です。
なぜshell = Trueを使用しないのですか? –
@DavidDoriaはセキュリティ上の責任であるため、攻撃者がPopenへの入力に影響を及ぼすことができれば、コードを注入することができます。 (例えば、 "ls" + user_inputの実行は明らかに間違っています)。 shell = Falseはこれをすべて避けます。そのため、セキュリティプロパティはPopenで呼び出すプログラムに依存し、余分なものはありません。 –
あなたがシェルを実行し、それを複数のコマンドを送信(およびその出力を読む)できるようにしたいと仮定している、あなたが行うことができます表示されますこのような何か:
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つのメジャー上記のの問題は、stdin
とstdout
のパイプがブロッキングモードになっているため、シェルからの出力が永久に "スタック"するのは簡単です。私はそれを試していませんが、これに対処する方法を示すActiveStateサイトにrecipeがあります。
更新:関連する質問/回答を見た後、それはそれだけで使用する方が簡単かもしれないように見えますPythonのビルトインselect
モジュールそこのデータは、あなたがのために同じことを行うもすべきである(stdout
に読み取るためにかどうかを確認するためにstderr
、もちろん):
>>> select.select([p.stdout], [], [], 0)
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], [])
実際には、shell = Trueのコマンド( ';'で囲んで)を連結するよりも変わりません。元のポスターが何を示唆しているかを知ることができました。シェルの機能が必要でない限り、それはまだ悪いですが、これは表示されていません。より安全な選択肢があります。可能であれば –
;それは疑問からは分かりません。しかし、何らかの理由で実際のユーザーとシェルの間の "プロキシ"として動作したい場合や、何らかのイベントなどに基づいてコマンドを定期的に送信したい場合、これを行うと便利かもしれません。たとえば、ActiveStateのレシピは、実際のユースケースに触発されているようです。 –
私は完全に同意する、私はちょうどこのアドバイスでは必ずしも良いとは思わない。私は尋ねる者だけが知っていると思う。 –
- 1. Pythonのpopenのgrepが
- 2. Pythonのサブプロセスpopenのデッドロック
- 3. LaunchImage persistent
- 4. Qt persistent QNetworkCookieJar
- 5. Yesod、WebSockets and Persistent
- 6. PopenによるPython grepとpipe
- 7. Pythonの実行popenの()サブプロセスは
- 8. Pythonの文字列リテラル内popenのコマンド
- 9. Pythonサブプロセス.Popenと非同期出力
- 10. サブプロセスPopenを使用するPopen
- 11. PopenのストリームをPython関数にリダイレクトするPython
- 12. popen on android NDK
- 13. Python FFMPEG AttributeError: 'Popen'オブジェクトに 'proc'属性がありません
- 14. Python - Popenのリストをコマンドとして使用する
- 15. マルチスレッドのPython Popen - stdout/stderrログを削除できません
- 16. PopenをPythonなどで正しく使用する
- 17. Python Popenから 'mv'をワイルドカードで呼び出す
- 18. popenを待っているpythonスレッドを停止しますか?
- 19. Pythonサブプロセスのコマンドを実行します.Popen
- 20. Pythonで空のPopen()オブジェクトを作成しますか?
- 21. popenのログ管理質問
- 22. popen stderrとstdoutをパイプ
- 23. http persistent connectionおよびssl session
- 24. BlackBerry Persistent Storeがスローされるjava.lang.Error
- 25. Persistentでコンポジットキーを定義する方法
- 26. ENOMEMの原因:: popen()
- 27. Cのpopenのパフォーマンス
- 28. popenのファイル操作
- 29. ファイルへのpopen()の出力
- 30. Popenのサブプロセスの問題
"セッション"はこの文脈で何も意味しないので、あなたがしようとしていることを説明できますか?この質問は解析が難しく、多くの意味がないようです。あなたの目標が何であるかを説明すれば、おそらく助けになるでしょう。 –