我正在尝试利用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脚本中运行,它只会阻止我输入输入。如果我输入输入就行了。
但我不希望它阻止。我希望它像在命令行中一样运行。我该怎么做?
答案 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)