2017-07-20 11 views
0

pythonサブプロセスを利用して実行可能バイナリを入力で実行しようとしています。subprocess.communicate(input_string)はまだstdinからの入力を読み込もうとしています

私の実行ファイルは、JSONオブジェクトを入力として受け取り、それを処理します。実行ファイルを単独で実行すると、stdinからの入力待ちをブロックします。

次のコマンドは、端末上でうまく動作します:

echo '{"values":{"value_1":"1122","value_2":"abcd"}}' | ../path/to/bin/executable-script -option1=x -topic my_kafka_topic 

しかし、私は私のPythonスクリプトで入力JSONsを生成する必要があります。私は今、これをしようとしています。残念ながら私のプログラムは、Pythonスクリプト内で実行されません

import sys 
import subprocess 

if __name__ == '__main__': 

    input_string = '{\"values\":{\"value_1\":\"1122\",\"value_2\":\"abcd\"}}' 
    input_bytes = [elem.encode("hex") for elem in input_string] 

    bashCommand = '../path/to/bin/executable-script -option1=x -topic my_kafka_topic' 
    process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE) 
    print 'program blocks on next line' 
    data, error = process.communicate(input=input_bytes) 
    print 'data is {}'.format(data) 

、それはちょうど私が入力中に入力するのを待つブロックします。私が入力した場合、それはうまく動作します。

しかし、私はブロックしたくありません。私はそれをコマンドラインのように実行したい。どうすればいいですか?

+0

その他: 'bashCommand.split()'は使用しないでください。開始する配列として指定します。それ以外の場合は、ファイル名やその他の入力をリテラルスペースで指定したいときはいつでもバグがあります。 –

+0

'bashCommand'という名前は、シェルをまったく実行していないと誤解を招いています。つまり、' 2> err.log'のようなシェル構文が行に追加されても動作することを意味しますが、この意味は完全に偽です。 –

答えて

1

process.communicate()に引数を渡すことは正しいですが、stdin=subprocess.PIPEも渡す必要があります。したがって:

command = ['../path/to/bin/executable-script', '-option1=x', '-topic', 'my_kafka_topic'] 
process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
#         ^^^^^^^^^^^^^^^^^^^^^ 
process.communicate(input_data) 
関連する問題