2017-08-03 8 views
1

ログファイルにログを出力するように設定されたログオブジェクトを持つpythonプロセスがあります。Python:サブプロセスPopen stdoutをログファイルにリダイレクト

ここではscalaスクリプトをこのpythonプロセスを通して、subprocess Pythonモジュールを使用して呼び出そうとしています。

subprocess.Popen(scala_run_command, stdout=subprocess.PIPE, shell=True) 

問題は、いつでもpythonのプロセスが終了され、それだけで明示的にstty saneコマンドを実行した後の生活に到来する、シェルがハングします。私の推測では、それはstaoutのためにscalaスクリプトがシェルに出力してシェルがハングするために引き起こされるということです(stdoutの何かがシェルの正気を失う原因になります)。

同じ理由で、スカラスクリプトの出力をデフォルトのログファイルに取り込もうとしましたが、これは複数の方法では起こっていないようです。

ので、クエリがどのようにシェルコマンドのstdout出力はログファイルにsubprocessモジュールを介して走っ取得するには、に沸きます。 subprocess, runの代わりにこれを実現するより良い方法があるとしても、私はそのアイデアを知りたいと思っています。

現在のコードの状態は次のようになります。

__echo_command = 'echo ":load %s"' 
__spark_console_command = 'spark;' 
def run_scala_script(self, script): 
    echo_command = self.__echo_command % script 
    spark_console_command = self.__spark_console_command 
    echo_result = subprocess.run(echo_command, stdout=subprocess.PIPE, shell=True) 
    result = subprocess.run(spark_console_command, stdout=subprocess.PIPE, shell=True, input=echo_result.stdout) 
    logger.info('Scala script %s completed successfully' % script) 
    logger.info(result.stdout) 
+0

'shell = True'を削除してみませんか? –

+0

このパラメータを削除しても実行されません.FileNotFoundErrorで失敗します。 – greperror

+0

'shell = True'を削除し、' FileNotFoundError'をデバッグする必要があります。あなたは完全なパスを実行可能ファイルに渡していますか?あなたのコマンドの実際の内容を私たちに教えてください。 – senderle

答えて

0

使用

stdout, stderr = p.communicate() 

、次いでstdoutstderr続い

p = subprocess.Popen(...) 

サブプロセス出力ストリームの出力バイトを含むであろう。その後、stdoutの値を記録できます。

関連する問題