Кодировка по умолчанию для Python для stderr?

Я не уверен, хорошо ли я понимаю, но быстрое решение:

<html>
<script>
var table = [];
console.log(table);

function findInArrAndPush(obj){
	const found = table.some(el => el.issueID === obj.issueID);
	if (!found) table.push(obj);
	return table;
}
for(i=0;i<3;i++){
	var id = i;

	var objToAdd = {"executionDate":"01-01-1000",
  "issueID":id,
  "priority":{
     "jira": "1", 
     "computed":"1"
  },
  "expectedValue":{
     "jira": "2", 
     "computed":"2"
  }
};
console.log(findInArrAndPush(objToAdd));
//ADD TO FILE HERE
}

  </script>
<body>
</body>
</html>

единственное, что вам нужно сделать здесь - распечатать результат в файл.

7
задан ʞɔıu 12 March 2009 в 13:39
поделиться

3 ответа

Можно заставить stderr замолчать путем привязки его с пользовательским устройством записи:

#!/usr/bin/env python
import codecs, sys

class NullWriter:
    def write(self, *args, **kwargs):
        pass

if len(sys.argv) == 2:
   if sys.argv[1] == '1':
      sys.stderr = NullWriter()
   elif sys.argv[1] == '2':
      #NOTE: sys.stderr.encoding is *read-only* 
      #      therefore the whole stderr should be replaced
      # encode all output using 'utf8'
      sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print >>sys.stderr, u"\u20AC" # euro sign
print "ok"

Пример:

$ python silence_stderr.py
Traceback (most recent call last):
  File "silence_stderr.py", line 11, in <module>
    print >>sys.stderr, u"\u20AC"
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)

Заставленный замолчать stderr:

$ python silence_stderr.py 1
ok

Закодированный stderr:

$ python silence_stderr.py 2
€
ok

Примечание: У меня есть вышеупомянутые выводы внутри emacs поэтому для эмуляции его в терминале, который Вы могли сделать:

$ python ... 2>out.txt
$ cat out.txt

Примечание: В консоли Windows (после того, как chcp 65001 тот переключатель к 'utf-8' и с truetype шрифтом (Lucida Console)) у меня есть странные результаты:

C:\> python silence_stderr.py 2
Traceback (most recent call last):
  File "silence_stderr.py", line 14, in <module>
    print >>sys.stderr, u"\u20AC" # euro sign
  File "C:\pythonxy\python\lib\codecs.py", line 304, in write
    self.stream.write(data)
IOError: [Errno 13] Permission denied

Если шрифт не является truetype затем, исключение не повышает, но вывод является неправильным.

Perl работает на truetype шрифт:

C:\> perl  -E"say qq(\x{20ac})"
Wide character in print at -e line 1.
€

Перенаправление работает хотя:

C:\>python silence_stderr.py 2 2>tmp.log
ok
C:\>cat tmp.log
€
cat: write error: Permission denied

комментарий ре

От codecs.getwriter документация:

Ищите кодек для данного кодирования и возвратите его класс StreamWriter или функцию фабрики. Повышения a LookupError в случае, если кодирование не может быть найдено.

Упрощенное представление:

class UTF8StreamWriter:
    def __init__(self, writer):
        self.writer = writer
    def write(self, s):
        self.writer.write(s.encode('utf-8'))

sys.stderr = UTF8StreamWriter(sys.stderr)
5
ответ дан 6 December 2019 в 23:13
поделиться

Когда stderr не перенаправляется, он берет кодирование Вашего терминала. Это все идет наружу при перенаправлении его все же. Необходимо будет использовать sys.stderr.isatty (), чтобы обнаружить, если он перенаправляется, и закодируйте соответственно.

4
ответ дан 6 December 2019 в 23:13
поделиться

Вы могли также просто закодировать строку ASCII, заменив unicode символы, которые не отображаются. Затем Вы не должны волноваться о том, какой терминал Вы имеете.

asciiTitle = page_title.encode("ascii", "backslashreplace")
print >>sys.stderr, "bad page title", asciiTitle

Это заменяет символы, которые не могут быть закодированы Escape обратной косой черты, т.е. \xfc. Существуют некоторые другие опции замены также, описаны здесь:

http://docs.python.org/library/stdtypes.html#str.encode

2
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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