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 stdout freezing
- 2. サブプロセスpopen Python
- 3. Python popen pipe in loop
- 4. LaunchImage persistent
- 5. Pythonのpopenのgrepが
- 6. Pythonサブプロセス.Popen()とメッセージキュー(セロリ)
- 7. Pythonのサブプロセスpopenのデッドロック
- 8. パイソン - (Pythonの3.5で)popenの
- 9. Qt persistent QNetworkCookieJar
- 10. Scapy - persistent RandIP
- 11. docker-postgresql persistentローカルストレージ
- 12. JQuery persistent toggle div
- 13. Swift 3 - SwiftKeychainWrapper:KeychainWrapper.standard.set persistent
- 14. Yesod、WebSockets and Persistent
- 15. Django Celery Persistent revoke
- 16. サブプロセスPopenを使用するPopen
- 17. App Engineデータストアの@ Persistentフィールドを@ Persistentに変更できますか?
- 18. Python Popen _with_リアルタイム入出力制御
- 19. Pythonはパイプで '|' Popenの議論
- 20. popen with python python2.7の読み書きブロック
- 21. Pythonサブプロセス.Popenと非同期出力
- 22. サブプロセスcheck_output、Popen、getoutputの相違点python
- 23. PopenでのPythonのカールの使用
- 24. Pythonの文字列リテラル内popenのコマンド
- 25. Pythonの実行popenの()サブプロセスは
- 26. pythonのサブプロセスpopen非同期の理解
- 27. PopenによるPython grepとpipe
- 28. コンパイルコマンド(PowerShell)でPython Popenが失敗する
- 29. Python:サブプロセスPopen stdoutをログファイルにリダイレクト
- 30. popenのpython読み書きブロックpython2.7
"セッション"はこの文脈で何も意味しないので、あなたがしようとしていることを説明できますか?この質問は解析が難しく、多くの意味がないようです。あなたの目標が何であるかを説明すれば、おそらく助けになるでしょう。 –