Java中调用Python脚本的问题

如有这样的Python脚本

#test.py
print "hello"

python test.py            
hello

Java中调用该Python脚本

        ProcessBuilder builder = new ProcessBuilder();
        builder.command("python", "test.py");
        Process process = builder.start();
        process.waitFor();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        bufferedReader.lines().forEach(System.out::println);

能正确输出hello

然后在test.py中引入了结巴分词

# test.py
import jieba
print "hello"

print("/".join(jieba.cut("hello world")))
print("/".join(jieba.cut("你好 世界")))

#
python test.py 2>/dev/null
hello
hello/ /world
你好/ /世界

此时Java中调用该Python脚本 中文分词的结果读取不到 不知何故?

java InvokePythonCommand
hello
hello/ /world

应该是Python2对中文支持不好的缘故 改成Python3就正常了

builder.command("python3", "test.py");

此时运行Java程序

java InvokePythonCommand
hello
hello/ /world
你好/ /世界
阅读 5.9k
3 个回答

我试过了你的代码,没有问题,能正确的输出 —— 检查下你写好 test.py 之后是否保存了。
test.py 的内容

Test.java 的内容

编译运行

原因似乎是字符编码的问题

在Python2中 结巴分词后默认为unicode

>>> seg_list = jieba.cut('你好世界')
>>> [w for w in seg_list]
[u'\u4f60\u597d', u'\u4e16\u754c']

需要先对Unicode进行编码

>>> [w.encode('utf-8') for w in seg_list]
['\xe4\xbd\xa0\xe5\xa5\xbd', '\xe4\xb8\x96\xe7\x95\x8c']

clipboard.png

test.py进行如下修改后 Java中就能正确读取中文的分词结果了

print("/".join([w.encode('utf') for w in jieba.cut("你好世界")]))

参考文档
http://www.nltk.org/book/ch03...

因为 Python 2 里处理中文就是各种报错。你重定向到管道之后 Python 2 认为是 ascii 编码,于是挂了。

请尽全力避免使用 Python 2。它不仅对开发者有更高的要求,而且很多标准库、第三方库的中文处理都有问题的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题