Existem várias maneiras de escrever no 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)
Isso parece contradizer o zen do Python # 13 † , então qual é a diferença aqui e existem vantagens ou desvantagens de uma maneira ou de outra? Qual caminho deve ser usado?
† Deve haver uma - e de preferência apenas uma - maneira óbvia de fazê-lo.
Respostas:
Eu achei que este era o único pequeno + flexível + portátil + legível:
A função
eprint
pode ser usada da mesma maneira que aprint
função padrão :fonte
print
em todo o seu programa. Somente no módulo que contém a definição deeprint()
. Coloque-o em um pequeno arquivo, importeeprint
-o para seus outros arquivos e você poderá continuar usando a instruçãoprint
pelo tempo que desejar.É 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 desempenho ... com essas duas coisas em mente, com python 80% do seu código será python. a compreensão da lista é a "grande coisa" que não é usada com tanta frequência (legibilidade).
fonte
print
declaração é a impressão fácil de valores que não são de cadeia, sem a necessidade de convertê-los primeiro. Se precisar de uma declaração de impressão, eu recomendo, portanto, usando a terceira opção a ser python 3 prontosys.stderr.write()
não é nada assimprint
. Não adiciona uma nova linha.os.linesep
. Isso éstderr
que estamos falando, afinal. Não quero que o console mexa com a nova linha errada.print >> sys.stderr
foi embora em Python3. http://docs.python.org/3.0/whatsnew/3.0.html diz:Para muitos de nós, parece um pouco natural relegar o destino ao final do comando. A alternativa
parece mais orientado a objetos e elegantemente vai do genérico ao específico. Mas observe que
write
não é um substituto 1: 1 paraprint
.fonte
print('spam', file=sys.stderr)
. Se você estiver repetindo várias vezes, poderá codificar a função 'eprint' como na resposta mais popular, mas, nesse caso, eu perguntaria: o que há de errado com o log? stackoverflow.com/a/41304513/1450294with sys.stderr as dest:
antes uma chamada recuado paraprint("ERROR", file=dest)
Ninguém mencionou
logging
ainda, mas o log foi criado especificamente para comunicar mensagens de erro. A configuração básica configurará um manipulador de fluxo gravando no stderr.Este script:
tem o seguinte resultado quando executado na linha de comando:
e bar.txt conterá o 'hello world' impresso no stdout.
fonte
Para Python 2, minha escolha é:
print >> sys.stderr, 'spam'
porque você pode simplesmente imprimir listas / dictos etc. sem convertê-lo em string.print >> sys.stderr, {'spam': 'spam'}
ao invés de:sys.stderr.write(str({'spam': 'spam'}))
fonte
"{0}".format({'spam': 'spam'})
assim, não é? Eu diria que você deve evitar a conversão explícita em string. Edit: Eu acidentalmente uma gramáticaEu fiz o seguinte usando Python 3:
Portanto, agora eu posso adicionar argumentos de palavras-chave, por exemplo, para evitar o retorno de carro:
fonte
Eu diria que sua primeira abordagem:
é a "Uma... maneira óbvia de fazê-lo". Os outros não cumprem a regra 1 ("Bonito é melhor que feio").
fonte
>>
significa sintaticamente? Eu entendo que é um esforço copiar cópias do bash>
, então é alguma sintaxe do calçado para fazer exatamente isso?std::cout << "spam";
Isso imitará a função de impressão padrão, mas a saída no stderr
fonte
print
não inclui um flush.No Python 3, pode-se usar apenas print ():
quase fora da caixa:
ou:
Isso é direto e não precisa incluir nada além disso
sys.stderr
.fonte
EDIT Em retrospectiva, acho que a potencial confusão com a mudança do sys.stderr e a falta de atualização do comportamento fazem com que essa resposta não seja tão boa quanto usar apenas uma função simples, como outros já apontaram.
Usar parcial apenas poupa 1 linha de código. A confusão em potencial não vale a pena salvar 1 linha de código.
original
Para facilitar ainda mais, aqui está uma versão que usa 'parcial', que é uma grande ajuda nas funções de agrupamento.
Você então usa assim
Você pode verificar se está imprimindo no stderr e não no stdout fazendo o seguinte (código de substituição 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 à função agrupada no momento da criação. O que significa que, se você redirecionar o stderr posteriormente, isso não afetará esta função. Se você planeja redirecionar o stderr, use o método ** kwargs mencionado por aaguirre nesta página.
fonte
O mesmo se aplica ao stdout:
Como indicado nas outras respostas, o print oferece uma interface bonita que geralmente é mais conveniente (por exemplo, para imprimir informações de depuração), enquanto a gravação é mais rápida e também pode ser mais conveniente quando você precisa formatar a saída exatamente de uma certa maneira. Eu consideraria a manutenção também:
Mais tarde, você pode decidir alternar entre stdout / stderr e um arquivo regular.
A sintaxe print () mudou no Python 3, portanto, se você precisar suportar as duas versões, write () poderá ser melhor.
fonte
from __future__ import print_function
é a melhor maneira de apoiar tanto Python 2.6+ e Python 3.Estou trabalhando no python 3.4.3. Estou cortando um pouco de digitação que mostra como cheguei aqui:
Funcionou? Tente redirecionar o stderr para um arquivo e veja o que acontece:
Bem, além do fato de que a pequena introdução que o python oferece a você foi arrastada para o stderr (para onde mais ele iria?), Funciona.
fonte
Se você fizer um teste simples:
Você verá que sys.stderr.write () é consistentemente 1,81 vezes mais rápido!
fonte
Se você deseja sair de um programa devido a um erro fatal, use:
e
import sys
no cabeçalho.fonte
A diferença entre a função de gravação print e stderr: stderr : stderr (erro padrão) é um pipe que é incorporado em todos os sistemas UNIX / Linux, quando seu programa trava e imprime informações de depuração (como um traceback em Python), ele vai para o stderr tubo.
print : print é um invólucro que formata as entradas (a entrada é o espaço entre o argumento e a nova linha no final) e, em seguida, chama a função de gravação de um determinado objeto, o objeto fornecido por padrão é sys.stdout, mas podemos passar um arquivo, ou seja, também podemos imprimir a entrada em um arquivo.
Python2: Se estamos usando python2, então
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
fonte