subprocess.communicate(input_string)仍尝试从stdin读取输入

时间:2017-07-20 20:58:48

标签: python unix subprocess

我正在尝试利用python子进程来运行带有输入的可执行二进制文件。

我的可执行文件将JSON对象作为输入,并对其进行处理。如果您自己运行可执行文件,它将阻止等待stdin的输入。

以下命令在终端上运行正常:

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

但我需要在我的python脚本中生成输入JSON。所以我现在正在尝试这个:

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)

不幸的是我的程序不会在python脚本中运行,它只会阻止我输入输入。如果我输入输入就行了。

但我不希望它阻止。我希望它像在命令行中一样运行。我该怎么做?

1 个答案:

答案 0 :(得分: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)