Проблема с Юникодом в Python как фильтром procmail - PullRequest
0 голосов
/ 26 февраля 2019

У меня возникают проблемы при попытке обработать почту с помощью procmail и Python.Я использую синтаксис примерно так:

:0
...[Filter] | (python3 script.py) >> file.txt

в качестве синтаксиса procmail.Мой скрипт Python извлекает почту из stdin, преобразует MIME в Unicode и выводит ее в файл следующим образом:

def main():
        dataset = Data()
        indata = (Parser().parse(sys.stdin)).as_string()

        indata = (quopri.decodestring(indata)).decode('utf-8')

        arrayofstrings = indata.split("\n")

        for line in arrayofstrings:
                [write some data to <dataset>]
        filename = "outfile.txt"
        file = open(filename, "w")
        file.write(dataset.toString())

Data () - это структура, которая хранит серию строк Unicode и toString () объединяет их,

Если я запускаю этот скрипт в bash с сохраненной почтой, например:

cat test.txt | python3 script.py

, он корректно записывает данные в файл в формате Unicode.

Однако, если яполучить письмо и обработать его, procmail записывает в журнал следующую ошибку:

UnicodeEncodeError: кодек «ascii» не может кодировать символ «\ xdf» в позиции 83: порядковый номер не находится в диапазоне (128)

Если я изменю последнюю строку скрипта python на:

file.write(dataset.toString().encode('utf-8'))

, я получу правильно закодированную строку в файле.Я хочу это в Unicode, хотя.

1 Ответ

0 голосов
/ 20 марта 2019

Непосредственной проблемой является то, что Python устанавливает свою системную кодировку на основе терминала, к которому он подключен;но, конечно, когда вы запускаете его из Procmail, он вообще не подключается к терминалу.

Обходной путь может включать установку PYTHONIOENCODING в вашем файле Procmail:

:0
...[Filter] | PYTHONIOENCODING=utf-8 python3 script.py >> file.txt

(обратите внимание такжечто круглые скобки не требуются, они будут запускать Python в подоболочке, но, похоже, нет никакой причины, чтобы запускать его в подоболочке.)

Обратите внимание, что это функционально не отличается откодирование вывода в UTF-8 в вашем скрипте (хотя я вижу, как вы можете избежать его жесткого кодирования).Текст в файле не может быть «Unicode» без сериализации в кодировку.(А если вы не хотите UTF-8, вам нужно указать, что вы хотите ... Возможно, UTF-16le? Это будет совместимо с Java и устаревшей Windows.)

...