Estou usando python ftplib
para escrever um pequeno cliente FTP, mas algumas das funções do pacote não retornam saída de string, mas imprimem em stdout
. Quero redirecionar stdout
para um objeto do qual poderei ler a saída.
Eu sei que stdout
pode ser redirecionado para qualquer arquivo regular com:
stdout = open("file", "a")
Mas eu prefiro um método que não use a unidade local.
Estou procurando algo como o BufferedReader
em Java que pode ser usado para quebrar um buffer em um fluxo.
stdout = open("file", "a")
por si só irá redirecionar qualquer coisa.Respostas:
fonte
stdout
objeto original , pois ele está sempre disponível emsys.__stdout__
. Consulte docs.python.org/library/sys.html#sys.__stdout__ .finally:
bloco, para que também seja reatribuído se uma exceção surgir no meio.try: bkp = sys.stdout ... ... finally: sys.stdout = bkp
Há a função contextlib.redirect_stdout () no Python 3.4:
Aqui está um exemplo de código que mostra como implementá-lo em versões mais antigas do Python .
fonte
redirect_stderr
o mais recente Python!Apenas para adicionar à resposta de Ned acima: você pode usar isso para redirecionar a saída para qualquer objeto que implemente um método write (str) .
Isso pode ser usado com bom efeito para "capturar" a saída stdout em um aplicativo GUI.
Aqui está um exemplo bobo no PyQt:
fonte
A partir do Python 2.6, você pode usar qualquer coisa que implemente a
TextIOBase
API do módulo io como um substituto. Essa solução também permite que você usesys.stdout.buffer.write()
no Python 3 para escrever (já) cadeias de bytes codificadas no stdout (consulte stdout no Python 3 ). UsarStringIO
não funcionaria então, porquesys.stdout.encoding
nemsys.stdout.buffer
estaria disponível.Uma solução usando o TextIOWrapper:
Esta solução funciona para Python 2> = 2.6 e Python 3.
Observe que nosso novo
sys.stdout.write()
aceita apenas cadeias unicode esys.stdout.buffer.write()
somente aceita cadeias de bytes. Pode não ser o caso do código antigo, mas geralmente é o caso do código criado para ser executado no Python 2 e 3 sem alterações, o que novamente é utilizadosys.stdout.buffer
.Você pode criar uma pequena variação que aceita cadeias de caracteres unicode e bytes para
write()
:Você não precisa definir a codificação do buffer como sys.stdout.encoding, mas isso ajuda ao usar esse método para testar / comparar a saída de script.
fonte
Este método restaura o sys.stdout mesmo se houver uma exceção. Ele também obtém qualquer saída antes da exceção.
Testado em Python 2.7.10 usando
io.BytesIO()
Testado em Python 3.6.4 usando
io.StringIO()
Bob, adicionado a um caso, se você sentir que alguma coisa da experimentação de código modificado / estendido pode ser interessante em qualquer sentido, caso contrário, fique à vontade para excluí-lo
fonte
Um gerenciador de contexto para python3:
use assim:
fonte
No Python3.6, os módulos
StringIO
ecStringIO
se foram, você deve usá-io.StringIO
lo. Portanto, faça isso como a primeira resposta:fonte
Use
pipe()
e escreva no descritor de arquivo apropriado.https://docs.python.org/library/os.html#file-descriptor-operations
fonte
Aqui está outra opinião sobre isso.
contextlib.redirect_stdout
comio.StringIO()
o documentado é ótimo, mas ainda é um pouco detalhado para o uso diário. Veja como torná-lo uma linha única subclassificandocontextlib.redirect_stdout
:Como __enter__ retorna self, você tem o objeto do gerenciador de contexto disponível após a saída do bloco with. Além disso, graças ao método __repr__, a representação em cadeia do objeto gerenciador de contexto é, de fato, stdout. Então agora você tem,
fonte