Есть несколько способов написать в stderr:
# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
Кажется, что это противоречит дзен Python # 13 † , в чем здесь разница, и есть ли какие-либо преимущества или недостатки в том или ином случае? Какой способ следует использовать?
† Должен быть один - и желательно только один - очевидный способ сделать это.
Ответы:
Я обнаружил, что это единственный короткий + гибкий + портативный + читаемый:
Функцию
eprint
можно использовать так же, как и стандартнуюprint
функцию:источник
print
всей вашей программы. Только в модуле, содержащем определениеeprint()
. Поместите его в небольшой файл, импортируйтеeprint
из него в другие файлы, и вы можете продолжать использовать операторprint
столько, сколько захотите.Это мой выбор, просто более читаемый и точно говорящий о том, что вы собираетесь делать, и переносимый между версиями.
Изменить: «pythonic» - это третья мысль о читабельности и производительности ... с учетом этих двух вещей, с python 80% вашего кода будет pythonic. понимание списка - это «большая вещь», которая используется не так часто (удобочитаемость).
источник
print
оператора заключается в удобной печати нестроковых значений без необходимости их предварительного преобразования. Если вам нужна инструкция для печати, я бы порекомендовал использовать третий вариант, чтобы быть готовым к Python 3sys.stderr.write()
нет ничего подобногоprint
. Это не добавляет новую строку.os.linesep
. Об этомstderr
мы и говорим, в конце концов. Не хочу, чтобы консоль испортила неправильный перевод строки.print >> sys.stderr
ушел в Python3. http://docs.python.org/3.0/whatsnew/3.0.html говорит:Для многих из нас кажется несколько неестественным откладывать пункт назначения до конца команды. Альтернатива
выглядит более объектно-ориентированным и элегантно переходит от общего к конкретному. Но учтите, что
write
это не замена 1: 1print
.источник
print('spam', file=sys.stderr)
. Если вы делаете это снова и снова, вы можете кодировать функцию «eprint», как в самом популярном ответе, но в таком случае, я бы спросил, что не так с журналированием? stackoverflow.com/a/41304513/1450294with sys.stderr as dest:
до вызова с отступомprint("ERROR", file=dest)
Никто
logging
еще не упоминал , но регистрация была создана специально для сообщения об ошибках. Базовая конфигурация настроит потоковый обработчик для записи в stderr.Этот скрипт:
имеет следующий результат при запуске в командной строке:
и bar.txt будет содержать «привет мир», напечатанный на stdout.
источник
Для Python 2 мой выбор таков:
print >> sys.stderr, 'spam'
потому что вы можете просто печатать списки / дикты и т. Д. Без преобразования их в строку.print >> sys.stderr, {'spam': 'spam'}
вместо:sys.stderr.write(str({'spam': 'spam'}))
источник
"{0}".format({'spam': 'spam'})
любом случае, более питонский способ печати словаря был бы с чем-то вроде этого , не так ли? Я бы сказал, что вам следует избегать явного преобразования в строку. Изменить: я случайно грамматикуЯ сделал следующее, используя Python 3:
Так что теперь я могу добавить ключевые аргументы, например, чтобы избежать возврата каретки:
источник
Я бы сказал, что ваш первый подход:
«Один ... очевидный способ сделать это» Другие не удовлетворяют правилу № 1 («Красивее лучше, чем безобразно»).
источник
>>
значит синтаксически? Я понимаю, что это попытка скопировать bash>
, так что это какой-то синтаксис для включения?std::cout << "spam";
Это будет имитировать стандартную функцию печати, но вывод на stderr
источник
print
не включает флешВ Python 3 можно просто использовать print ():
почти из коробки:
или:
Это просто и не должно включать ничего кроме
sys.stderr
.источник
РЕДАКТИРОВАТЬ В ретроспективе, я думаю, что потенциальная путаница с изменением sys.stderr и отсутствием обновленного поведения делает этот ответ не таким хорошим, как использование простой функции, как указывали другие.
Использование только частичного экономит вам 1 строку кода. Потенциальная путаница не стоит сохранять 1 строку кода.
оригинал
Чтобы сделать это еще проще, вот версия, которая использует «частичный», который является большой помощью в обертывании функций.
Вы тогда используете это так
Вы можете проверить, что он печатает в stderr, а не в stdout, выполнив следующие действия (переопределение кода с http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):
Недостатком является частичным Назначает значение sys.stderr к обернутой функции в момент создания. Это означает, что если вы перенаправите stderr позже, это не повлияет на эту функцию. Если вы планируете перенаправить stderr, используйте метод ** kwargs, упомянутый aaguirre на этой странице.
источник
То же самое относится к stdout:
Как указано в других ответах, print предлагает симпатичный интерфейс, который часто более удобен (например, для печати отладочной информации), в то время как запись выполняется быстрее и также может быть более удобной, когда вам необходимо точно отформатировать вывод. Я бы также подумал о ремонтопригодности:
Позже вы можете переключиться между stdout / stderr и обычным файлом.
Синтаксис print () изменился в Python 3, поэтому, если вам нужно поддерживать обе версии, лучше использовать write () .
источник
from __future__ import print_function
- лучший способ поддержки как Python 2.6+, так и Python 3.Я работаю в Python 3.4.3. Я вырезал небольшой набор текста, который показывает, как я попал сюда:
Это сработало? Попробуйте перенаправить stderr в файл и посмотрите, что произойдет:
Ну, кроме того факта, что небольшое введение, которое дает вам Python, было добавлено в stderr (куда еще он пойдет?), Это работает.
источник
Если вы делаете простой тест:
Вы обнаружите, что sys.stderr.write () последовательно в 1,81 раза быстрее!
источник
Если вы хотите выйти из программы из-за фатальной ошибки, используйте:
и
import sys
в шапке.источник
Различие между print и функцией записи stderr : stderr : stderr (стандартная ошибка) - это канал, который встроен в каждую систему UNIX / Linux, когда ваша программа аварийно завершает работу и выводит отладочную информацию (например, трассировку в Python), она переходит к stderr труба.
Распечатать : print - это оболочка, которая форматирует входные данные (входные данные - это пробел между аргументом и символом новой строки в конце), а затем вызывает функцию записи для данного объекта, по умолчанию этот объект является sys.stdout, но мы можем передать файл, т. е. мы также можем напечатать вход в файл.
Python2: если мы используем python2, то
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
источник