Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Communication(输入\字符串)仍尝试从标准输入读取输入_Python_Unix_Subprocess - Fatal编程技术网

Python subprocess.Communication(输入\字符串)仍尝试从标准输入读取输入

Python subprocess.Communication(输入\字符串)仍尝试从标准输入读取输入,python,unix,subprocess,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脚本中生成输入JSO

我正试图利用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脚本中运行,它只会阻塞等待我输入。如果我输入,它工作正常


但我不想让它堵塞。我希望它像在命令行中一样运行。如何执行此操作?

将参数传递给
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)

旁白:不要使用
bashCommand.split()
。将其指定为要开始的数组。否则,每当您想要指定文件名或其他带有文本空格的输入时,都会出现错误。如果您在没有任何shell的情况下运行名称
bashCommand
,则该名称会产生误导——这意味着类似
2>err.log
的shell语法将在添加到行中时起作用,但这是完全错误的。