2016-07-27 11 views
4

私はJupyterノートブックで実行しているPython(3.5.2)スクリプトからコマンドラインプログラムを実行するためにサブプロセスを使用しています。サブプロセスは実行に時間がかかりますので、Jupiterノートブックの画面にstdoutを表示させてください。JupiterノートブックのPythonサブプロセスからのライブstdout出力

これは、端末から実行される通常のPythonスクリプトでは問題ありません。私はこの使用してください:

def run_command(cmd): 
from subprocess import Popen, PIPE 
import shlex 

with Popen(shlex.split(cmd), stdout=PIPE, bufsize=1, universal_newlines=True) as p: 
    for line in p.stdout: 
     print(line, end='') 
    exit_code = p.poll() 
return exit_code 

をしかし、私はJupyterノートブックでスクリプトを実行すると、それが画面にライブ標準出力を印刷しません。代わりに、サブプロセスの実行が完了した後にすべてを出力します。

これを解決する方法はありますか?あなたは(これはデフォルトですので、あなたは完全にstdout引数を省略することができます)stdout = Noneを設定した場合

多くのおかげで、 ジョニー

+1

あなたのプリントにflush = Trueを追加してみてください。 –

+0

Thanks、Padraic。私はそれを試みたが、うまくいかなかった。私はまた、forループの前にsys.stdout.flush()を追加しようとしましたが、どちらもうまくいきませんでした。 –

+0

Jupyterのどのシステムとバージョンでこれを実行していますか? UbuntuとPython 3の下で、jupyter_client 4.3.0、jupyter_console 5.0.0、jupyter_core 4.1.0でコードを実行し、プロセスが生成している間にstdoutが徐々に印刷されました。 – foglerit

答えて

1

は、その後、あなたのプロセスは、あなたIPythonノートブック・サーバを実行している端末への出力を書き込む必要があります。

これは、サブプロセスが親ファイルハンドラから継承するデフォルトの動作であるために発生します(docs参照)。

あなたのコードは次のようになります

from subprocess import Popen, PIPE 
import shlex 

def run_command(cmd): 
    p = Popen(shlex.split(cmd), bufsize=1, universal_newlines=True) 
    return p.poll() 

これは、ブラウザでのノートブックには印刷されませんが、少なくとも、あなたは他のコードが実行されている間非同期あなたのサブプロセスからの出力を見ることができます。

これが役に立ちます。

1

ipythonノートブックは、それ自身のsupport for running shell commandsです。サブプロセスのものをキャプチャする必要がなければ、できるだけ実行することができます

cmd = 'ls -l' 
!{cmd} 

!ノートブックに自動的にパイプされます。

関連する問題