我正在使用Popen
执行子进程并按如下方式提供输入(使用Python 2.7.4):
env = dict(os.environ)
env['LC_ALL'] = 'en_US.UTF-8'
args = ['chasen', '-i u', '-F"%m "']
process = Popen(args, stdout=PIPE, stderr=PIPE, stdin=PIPE, env=env)
out, err = process.communicate(input=string)
将条目添加到它所执行的环境是必要的,因为输入字符串包含日语字符,并且当脚本未从命令行执行时(在我的情况下由Apache调用),Python无法猜测编码。
这个设置对我来说和其他命令一样正常,但是现在我正在使用chasen
(一个日语标记器),每当我发送unicode字符时子进程都没有返回,它只是坐在那里Python脚本咀嚼内存。这看起来像编码问题,但我想我已经通过使用LC_ALL
环境变量指定编码来对此进行排序。
编辑:额外的怪异如下......从命令行执行Python脚本时我没有遇到这个问题,但有'。'字符的明显例外。出于某种原因,这也导致chasen
的陌生感。
答案 0 :(得分:2)
这是chasen中的一个错误。通过Python运行时,您可以看到它发出的以下系统调用:
write(1, "\n", 1) = 1
read(0, "", 4096) = 0
write(1, "\n", 1) = 1
read(0, "", 4096) = 0
即。它没有正确处理EOF。要解决此问题,只需在Python字符串中添加换行符('\n'
),如下所示:
# coding: utf-8
import os
from subprocess import Popen, PIPE
string = u"悪妻は百年の不作。"
env = dict(os.environ)
env['LC_ALL'] = 'en_US.UTF-8'
args = ['chasen', '-i u', '-F"%m "']
process = Popen(args, stdout=PIPE, stderr=PIPE, stdin=PIPE, env=env)
out, err = process.communicate(input=(string + u'\n').encode('utf-8'))
print(out)