Установка корректного кодирования при передаче по каналу stdout в Python

Код выполняет то, что вы просите: а. CloseMe планирует OpenMe на 10 секунд и закрывает книгу, затем b. Excel снова открывает рабочую книгу и вызывает OpenMe, который сам планирует на 10 минут, затем немедленно переходит к закрытию книги, и, наконец, Excel возобновляет работу через 10 минут в цикле. 116]

Насколько я понимаю, ваш код должен что-то выполнять в OpenMe или CloseMe, поэтому вы не хотите просто планировать вызов и закрывать книгу. Кроме того, для цикла один подпрограмма должен планировать другой. В общих чертах, вы могли бы пойти по этим направлениям:

Sub CloseMe()
    'Here, do whatever (if anything) must be done just before saving the workbook.
    '...

    'Schedule the OpenMe execution in 10 seconds.
    'I don't understand why you need to close the workbook, but that's not the question.
    Application.OnTime Now + TimeValue("00:00:10"), "OpenMe"
    ThisWorkbook.Close True
End Sub

Sub OpenMe()
    'Here, do whatever (if anything) must be done just as the workbook opens.
    '...

    'Schedule the CloseMe execution in 10 minutes.
    Application.OnTime Now + TimeValue("00:10:00"), "CloseMe"
End Sub
327
задан Peter Mortensen 11 November 2014 в 08:28
поделиться

3 ответа

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

эмпирическое правило А: Всегда используйте Unicode внутренне. Декодируйте то, что Вы получаете и кодируете то, что Вы отправляете.

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

Другим дидактическим примером является программа Python для преобразования между ISO-8859-1 и UTF-8, делая все прописным промежуточный.

import sys
for line in sys.stdin:
    # Decode what you receive:
    line = line.decode('iso8859-1')

    # Work with Unicode internally:
    line = line.upper()

    # Encode what you send:
    line = line.encode('utf-8')
    sys.stdout.write(line)

Установка кодирования системного значения по умолчанию является плохой идеей, потому что некоторые модули и библиотеки, которыми Вы пользуетесь, могут полагаться на факт, это - ASCII. Не делайте этого.

157
ответ дан Peter Mortensen 23 November 2019 в 00:50
поделиться

В Windows у меня была эта проблема очень часто при выполнении кода Python от редактора (как Сублимированный текст), но не при выполнении его от командной строки.

В этом случае, проверьте параметры своего редактора. В случае SublimeText это Python.sublime-build решило его:

{
  "cmd": ["python", "-u", "$file"],
  "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
  "selector": "source.python",
  "encoding": "utf8",
  "env": {"PYTHONIOENCODING": "utf-8", "LANG": "en_US.UTF-8"}
}
0
ответ дан 23 November 2019 в 00:50
поделиться

Во-первых, относительно этого решения:

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

Нецелесообразно явно печатать с заданной кодировкой каждый раз. Это будет повторяющимся и подверженным ошибкам.

Лучшее решение - изменить sys.stdout в начале вашей программы, чтобы кодировать с выбранной кодировкой. Вот одно решение, которое я нашел на Python: Как выбирается sys.stdout.encoding? , в частности, комментарий "toka":

import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
167
ответ дан 23 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: