Я уверен, выполнение подпроцесса с помощью Popen
и подачи его ввода следующим образом (с помощью Python 2.7.4):Popen подпроцесс не выходит, когда STDIN включает юникода
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
.
Python 2.x или 3.x? (Когда вы сталкиваетесь с проблемами Unicode, ответ почти всегда очень различается между ними.) – abarnert
На самом деле лучше указать версию _exact_, потому что есть основной переписывающий 'message' в 3.2, а некоторые важные исправления ошибок в Версии 2.7.x и 3.1.x ... – abarnert
Его программа имеет описанный симптом как в 2.7.4, так и в 3.3.1. Это происходит только тогда, когда вход содержит широкие символы UTF-8. Это имеет какое-то отношение к 'chasen', так как при замене этого' cat', он работает нормально. Но из командной строки 'chasen' также работает нормально. – nickie