Подпроцесс Popen не выходит, когда stdin включает unicode

Я выполняю подпроцесс с использованием Popen и 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 .

Edit: Extra weirdness следующим образом … Я не получаю эту проблему при выполнении сценария Python из командной строки с заметным исключением символа '.'. По какой-то причине это также вызывает странность от chasen .

One Solution collect form web for “Подпроцесс Popen не выходит, когда stdin включает unicode”

Это ошибка в часене. Когда вы запускаете Python, вы можете увидеть следующие системные вызовы, которые он вызывает:

 write(1, "\n", 1) = 1 read(0, "", 4096) = 0 write(1, "\n", 1) = 1 read(0, "", 4096) = 0 

т.е. он неправильно обрабатывает EOF . Чтобы исправить это, просто прикрепите новую строку ( '\n' ) к вашей строке Python, например:

 # 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) 
  • Unicode имя файла для python subprocess.call ()
  • Двойной декодирование юникода в python
  • кодировать и декодировать строку байтов python
  • Форматирование столбцов, содержащих символы не-ascii
  • Преобразование строк, таких как \\ uXXXX в python
  • python - как добавить литерал unicode к переменной?
  • предупреждение python dateutil unicode
  • текст с escape-последовательностями unicode в unicode в python
  • Python - лучший язык программирования в мире.