2012-05-04 23 views
4

すでに実行中のプロセスにコンソールのSTDIN/STDOUTを接続する方法はありますか?Python:* nixで実行中のプロセスのSTDIN/OUTと対話する

使用事例:

私はpopenを使用して、コマンドラインで別のPythonスクリプトを実行するPythonスクリプトを持っています。

たとえば、foo.pypython bar.pyを実行するためにpopenを実行します。

次に、入力時のbar.pyブロック。私はpython bar.pyのPIDを得ることができます。対話的に動作するために、実行中のPythonインスタンスに新しいコンソールを接続する方法はありますか?これはpdbbar.pyの内部で実行したいので特に便利です。

答えて

4

途中です。 bar.pyを開始する方法を変更して、stdinとstdoutを引き継ぐ準備をすることができます。

単純な方法は、名前付きパイプを作成して、Popenコールでstdin/stdoutとしてこれらを供給することです。シェル(exec <pipe1 >pipe2)からこれらのパイプに接続して対話することができます。これは、プロセスが何をしているかを見るためにパイプに接続する必要があるという欠点があります。ログファイルにteeを使用して対処することはできますが、端末の能力要求であるbar.pyに応じて、この種の対話は最大の喜びではないかもしれません。

より良い方法は、あなたのプロセスツリーにGNU screenまたはtmuxのようなターミナルマルチプレクサを組み込むことである可能性があります。これらのツールは、アプリケーションが実行される仮想端末を作成できます。その後、いつでも他の端末をこの端末バッファに接続して切り離すことができます。具体的には、foo.pyscreenまたはtmuxで、完全な(VT100)端末エミュレーションではpython bar.pyが実行されます。たぶんこれはあなたの問題を解決するでしょう。

+1

+1の名前付きパイプ –

+0

これは有望です - 名前付きパイプで 'Popen'を使って入出力を行うことができますが、' exec'の使い方は分かりません。私は 'os.mkfifo( '/ tmp/testout')'と 'os.mkfifo( '/ tmp/testin')'を使って2つの名前付きパイプを設定し、 'Popen(cmd、stdout = open( '/ tmp/testout '、' a ')、stdin = open('/tmp/testin '、' r ')) 'を実行します。'exec>/tmp/testin

+0

' screen'を使って作業しました!どのような美しい解決策 - ありがとう!私はまだexecの使い方を知りたいと思っています。 –

0

stdinまたはstdoutを実行中のプロセスにリダイレクトすることはできません。ただし、foo.pyからfoo.pystdinからコードを追加してbar.pystdoutに送信することもできます(逆も同様)。このモデルでは

foo.pyは、パイプにbar.pystdinstdoutを接続しますと、それらのパイプと実際のstdin/stdoutとの間でデータを往復ための責任を負うことになります。

+0

FYI明らかに、いくつかの状況では、実行中のプロセスに対してstdinとstdoutをリダイレクトすることは可能です:http://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been -started-using-command-lin(しかしこれは私にインタラクティブ性を与えません) –

+0

あなたのリンクを見た後、答えはまだ "ノー"と思います。あなたのプロセスに 'gdb'を添付したいのであれば、多くのことを行うことができますが、開発環境の外ではあまり実用的ではありません。 – larsks

関連する問題