Como imprimir em stderr em Python? DoCow
impressão python python 2.7 stderr zen
Classe base genérica para o UserControl do WinForm Entendendo "aleatoriedade" Obter o tamanho da fonte calculada para o elemento DOM em JS Webfont Suavização e Antialiasing no Firefox e Opera É um int volátil em Java thread-safe? Projeto da máquina de estado C Restrição de access: O tipo 'Aplicativo' não é API (restrição na biblioteca requerida rt.jar) Como descobrir qual programa está usando a porta 80 no Windows? Como obter uma lista de datas entre duas datas no mysql select query D3js: Colocação automática de labels para evitar sobreposições? (força de repulsão) O MATLAB OOP está lento ou estou fazendo algo errado? O .NET 4.0 é compatível com o Windows XP SP2 ou abaixo? A derivação do quadrado do retângulo é uma violação do Princípio de Substituição de Liskov? Melhor maneira de determinar se dois caminho de referência para o mesmo arquivo em c # como fazer saveAsTextFile NÃO dividir a saída em vários arquivos?
Eu me deparei com várias maneiras de escrever para stderr:
# Note: this first one is longer working 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)
Parece contradizer o zen do Python # 13 † , então qual é a maneira preferida de fazer isso? Existem vantagens ou desvantagens de uma forma ou de outra?
† Deve haver uma – e de preferência apenas uma – maneira óbvia de fazê-lo.
Eu encontrei este para ser o único curto + flexível + portátil + legível:
A function eprint pode ser usada da mesma forma que a function de print padrão:
sys.stderr.write() é a minha escolha, apenas mais legível e dizendo exatamente o que você pretende fazer e portátil em todas as versões.
Edit: ser 'pythonic' é um terceiro pensamento para mim sobre legibilidade e performance … com estas duas coisas em mente, com python 80% do seu código será pythonic. compreensão da lista é a "grande coisa" que não é usada com tanta frequência (legibilidade).
Para o Python 2, minha escolha é: print >> sys.stderr, 'spam' Porque você pode simplesmente imprimir listas / dictionarys etc. sem convertê-lo em string. print >> sys.stderr, {'spam': 'spam'} vez de: sys.stderr.write(str({'spam': 'spam'}))
print >> sys.stderr se foi em Python3. http://docs.python.org/3.0/whatsnew/3.0.html diz:
Infelizmente, isso é muito feio. Como alternativa, use
mas note que write não é uma substituição 1: 1 para print .
Ninguém mencionou o logging ainda, mas o registro foi criado especificamente para comunicar mensagens de erro. Por padrão, ele está configurado para gravar em stderr. Este script:
# foo.py import logging logging.basicConfig(format='%(message)s') logging.warn('I print to stderr by default') logging.info('For this you must change the level and add a handler.') print('hello world')
tem o seguinte resultado quando executado na linha de comando:
(e bar.txt contém o 'olá mundo')
Eu diria que sua primeira abordagem:
é o "Um … jeito óbvio de fazê-lo" Os outros não satisfazem a regra # 1 ("Linda é melhor que feia").
Eu fiz o seguinte usando o Python 3:
Então agora eu posso adicionar argumentos de palavras-chave, por exemplo, para evitar o retorno de carro:
Isso imitará a function de impressão padrão, mas a saída no stderr
EDIT Na visão de trás, eu acho que a confusão potencial com a mudança de sys.stderr e não ver o comportamento atualizado faz com que essa resposta não seja tão boa quanto apenas usar uma function simples como outros apontaram.
Usando parcial só você economiza 1 linha de código. A confusão potencial não vale a pena salvar uma linha de código.
Para facilitar ainda mais, aqui está uma versão que usa 'parcial', o que é uma grande ajuda nas funções de empacotamento.
Você então usá-lo assim
Você pode verificar se está imprimindo para stderr e não stdout fazendo o seguinte (código de acompanhamento de http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):
A desvantagem disso é parcial atribui o valor de sys.stderr à function envolvida no momento da criação. O que significa que, se você redirect o stderr mais tarde, isso não afetará essa function. Se você planeja redirect o stderr, então use o método ** kwargs mencionado por aaguirre nesta página.
O mesmo se aplica ao stdout:
Como afirmado nas outras respostas, a impressão oferece uma interface bonita que é geralmente mais conveniente (por exemplo, para imprimir informações de debugging), enquanto a gravação é mais rápida e também pode ser mais conveniente quando você precisa formatar a saída exatamente de uma determinada maneira. Eu consideraria a manutenção também:
Posteriormente, você pode decidir alternar entre stdout / stderr e um arquivo regular.
A syntax print () mudou no Python 3, então se você precisar suportar ambas as versões, write () pode ser melhor.
Eu estou trabalhando em python 3.4.3. Estou cortando um pouco de digitação que mostra como cheguei aqui:
Funcionou? Tente redirect o stderr para um arquivo e veja o que acontece:
Bem, além do fato de que a pequena introdução que python oferece a você foi sugada para stderr (onde mais ela iria?), Funciona.
Se você fizer um teste simples:
Você vai descobrir que sys.stderr.write () é consistentemente 1,81 vezes mais rápido!
A resposta para a pergunta é: Há uma maneira diferente de imprimir stderr em python, mas isso depende de 1.) qual versão em python estamos usando 2.) qual saída exata queremos.
A diferença entre a function de gravação de print e stderr: stderr : stderr (erro padrão) é um pipe embutido em cada sistema UNIX / Linux, quando seu programa trava e imprime informações de debugging (como um traceback em Python), ele vai para o stderr tubo.
print : print é um wrapper que formata as inputs (a input é o espaço entre o argumento e a nova linha no final) e então chama a function write de um dado object, o object dado por padrão é sys.stdout, mas podemos passar um arquivo ou seja, podemos imprimir a input em um arquivo também.
Python2: Se estamos usando python2, então
A vírgula final do Python2 em Python3 se tornou um parâmetro, portanto, se usarmos vírgulas à direita para evitar a nova linha depois de uma impressão, isso parecerá com impressão ('Texto para impressão', fim = ') que é um erro de syntax sob Python2 .
Se nós verificamos o mesmo acima do sceario em python3:
No Python 2.6, há uma importação futura para tornar a impressão em uma function. Portanto, para evitar erros de syntax e outras diferenças, devemos iniciar qualquer arquivo em que usarmos print () com a partir do futuro import_impress_function. A importação futura funciona somente no Python 2.6 e posterior, portanto, para o Python 2.5 e versões anteriores, você tem duas opções. Você pode converter a impressão mais complexa em algo mais simples ou usar uma function de impressão separada que funcione sob o Python2 e o Python3.
Caso: Apontar para o fato de que sys.stderr.write () ou sys.stdout.write () (stdout (saída padrão) é um canal embutido em todo sistema UNIX / Linux) não é um substituto para impressão, mas sim Podemos usá-lo como uma alternativa em alguns casos. Print é um wrapper que envolve a input com espaço e nova linha no final e usa a function write para gravar. Essa é a razão pela qual sys.stderr.write () é mais rápido.