"Contextlib.redirect_stdout" no funciona en Ipython -- python camp Relacionados El problema

“contextlib.redirect_stdout” not working on Ipython


0
vote

problema

Español

Estoy trabajando en Ipython, me gusta obtener información de ayuda sobre os.stat y redirige la salida a un archivo de marcas simples:

  In [57]: with contextlib.redirect_stdout(open("stat_help_docs.md", "w")):     ...:     help(os.stat)     ...:      In [58]: os.stat("stat_help_docs.md").st_size Out[58]: 1   

El "stat_help_docs.md" está vacío, no pudo escribir los documentos de Ayuda a ella.
Sin embargo, si lo intenté en el modo interactivo de Python estándar:

  4/1/2015 01:18 PM - [ResultSetConverter.convert] column_name [_id] 4/1/2015 01:18 PM - [ResultSetConverter.convert] column_name [image] 4/1/2015 01:18 PM - [ResultSetConverter.convert] column_name [company_code] 4/1/2015 01:18 PM - [ResultSetConverter.convert] Exception: Column 'company_code' not found. 0  

logró escribir en el archivo.
Supongo que el problema podría estar en el escenario de Ipython,
¿Podría proporcionar algún sugerencia para ayudar a cavar en el problema?

Original en ingles

I am working on Ipython like to get help info about os.stat and redirect the output to a plain markdown file:

In [57]: with contextlib.redirect_stdout(open("stat_help_docs.md", "w")):     ...:     help(os.stat)     ...:      In [58]: os.stat("stat_help_docs.md").st_size Out[58]: 1 

The "stat_help_docs.md" is empty, it failed to write help docs to it.
However, If I tried in the Standard Python Interactive Mode:

>>> import os >>> import contextlib >>> with contextlib.redirect_stdout(open("another_stat_help_docs.md", "w")): ...     help(os.stat) ...  >>> os.stat("another_stat_help_docs.md").st_size 919 

It succeeded in write to the file.
I assume the problem might lie in the setting of Ipython,
Could please provide any hints to help dig in the problem?

  
   
   

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Necesita lavar el búfer de escritura de archivos:

  In [9]: f = open('stat_help_docs.txt', 'w')   In [10]: with contextlib.redirect_stdout(f):     ...:     help(os.stat)  In [11]: os.stat("stat_help_docs.txt").st_size Out[11]: 0  In [12]: f.flush()  In [13]: os.stat("stat_help_docs.txt").st_size Out[13]: 919   

En la carcasa de Python estándar, el objeto de archivo se recicla justo después de rs.getObject(column_name) 0 el búfer de escritura subyacente se enjuaga, sin idea de por qué Ipython Shell tiene referencias adicionales para el objeto de archivo.

Pero IMO One no debe confiar en GC para descargar el búfer de escritura, ya sea que use el archivo obj como un administrador de contexto ( rs.getObject(column_name) 1111 ) o enjuague explícitamente.

 

You need flush the file write buffer:

In [9]: f = open('stat_help_docs.txt', 'w')   In [10]: with contextlib.redirect_stdout(f):     ...:     help(os.stat)  In [11]: os.stat("stat_help_docs.txt").st_size Out[11]: 0  In [12]: f.flush()  In [13]: os.stat("stat_help_docs.txt").st_size Out[13]: 919 

In the standard python shell, the file object gets recycled right after with context and the underlying write buffer is flushed, no idea why IPython shell holds extra references for the file object.

But IMO one shouldn't rely on GC to flush the write buffer, either use file obj as a context manager (with open('...'):) or flush explicitly.

 
 

Relacionados problema

51  Usando 'in' para que coincida con un atributo de los objetos de Python en una matriz  ( Using in to match an attribute of python objects in an array ) 
No recuerdo si estaba soñando o no, pero parece que me recuerdo que hay una función que permitió algo como, foo in iter_attr(array of python objects, attri...

682  Agregar un método a una instancia de objeto existente  ( Adding a method to an existing object instance ) 
He leído que es posible agregar un método a un objeto existente (es decir, no en la definición de clase) en Python. Entiendo que no siempre es bueno hacerlo...

55  Vistas de clase en Django  ( Class views in django ) 
django Ver puntos a una función, lo que puede ser un problema si quieres cambiar solo un poco de funcionalidad. Sí, podría tener un millón de argumentos de ...

62  Sistema de integración continua para una base de código Python  ( Continuous integration system for a python codebase ) 
Estoy empezando a trabajar en un proyecto de hobby con una base de código python y me gustaría configurar alguna forma de integración continua (es decir, ej...

536  ¿Cómo uso IterTools.Groupby ()?  ( How do i use itertools groupby ) 
No he podido encontrar una explicación comprensible de cómo usar realmente la función itertools.groupby()644 de Python. Lo que estoy tratando de hacer es es...

49  Obtener una vista previa JPEG de un PDF en Windows?  ( Get a preview jpeg of a pdf on windows ) 
Tengo una aplicación multiplataforma (Python) que necesita generar una vista previa de JPEG de la primera página de un PDF. en la Mac estoy desplazando SIP...

77  Procesamiento XML en Python [cerrado]  ( Xml processing in python ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

39  Python y MySQL  ( Python and mysql ) 
Puedo conseguir que Python funcione con PostgreSQL, pero no puedo hacer que funcione con MySQL. El problema principal es que, en la cuenta de alojamiento comp...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

41  ¿Cómo puedo encontrar la ruta completa a una fuente de su nombre de visualización en una Mac?  ( How can i find the full path to a font from its display name on a mac ) 
Estoy usando la API de JavaScript de Photoshop para encontrar las fuentes en un PSD determinado. Dado un nombre de fuente devuelto por la API, quiero encont...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos