类型错误:';str';尝试将JSON对象传递给java进程时不支持缓冲区接口

类型错误:';str';尝试将JSON对象传递给java进程时不支持缓冲区接口,java,json,subprocess,python-3.4,Java,Json,Subprocess,Python 3.4,我正在使用Python的子进程调用Python中的Java程序。Java程序的输入/输出是JSON对象 这是我的代码,变量args基本上是程序接受的参数列表 json_object = json.dumps([{"foo" :1, "bar": 2}]) p = subprocess.Popen(args,executable="/usr/bin/java",stdin=subprocess.PIPE, stdout =subprocess.PIPE) p.stdin.write(json_ob

我正在使用Python的子进程调用Python中的Java程序。Java程序的输入/输出是JSON对象

这是我的代码,变量
args
基本上是程序接受的参数列表

json_object = json.dumps([{"foo" :1, "bar": 2}])
p = subprocess.Popen(args,executable="/usr/bin/java",stdin=subprocess.PIPE, stdout =subprocess.PIPE)
p.stdin.write(json_object)
p.stdin.close()
out = json.load(p.stdout)
但是,我有一个错误:
TypeError:'str'不支持缓冲区接口


我正在使用Python 3.4。我试图将
json\u对象
转换为字节,但这没有帮助

您正在尝试将Unicode字符串写入子进程。首先对字符串进行编码,或者使用
universal\u newlines=True
以Unicode模式打开管道(包括换行翻译),使Unicode字符串自动编码为系统的标准语言环境

从:

如果universal_newlines为
False
,则文件对象stdin、stdout和stderr将作为二进制流打开,并且不会进行行尾转换

如果universal\u newlines为
True
,则这些文件对象将使用
locale.getpreferredencode(False)
返回的编码以universal newlines模式作为文本流打开。对于stdin,输入中的行尾字符
'\n'
将转换为默认的行分隔符
os.linesep
。对于stdout和stderr,输出中的所有行尾都将转换为
'\n'
。有关更多信息,请参阅当构造函数的换行符参数为
None
io.TextIOWrapper
类的文档

对于JSON数据,我只需要在这里编码为UTF-8;使用而不是自己编写,因为这样可以更好地处理等待数据的问题。您还需要再次解码JSON数据。假设您的子流程也返回UTF-8编码的JSON,如下所示:

out_raw = p.communicate(json_object.encode('utf8'))[0]
out = json.loads(out_raw.decode('utf8'))

现在,我得到了一个错误
AttributeError:“tuple”对象没有属性“decode”
,因为out\u raw被分配了程序返回的值以及来自提示符的一些信息。下面是它的样子:(b'XXX XXX json_object XXX XXX)。XXX XXX是从提示符中抓取的消息。有办法避免吗?@user2161903是的,很抱歉。得到一个stdout和stderr的元组;更正方法是添加
[0]
以仅选择第一个。对,我实际上避免了命令行提示。再次感谢。