Retorno de caracteres nulos leyendo un fichero

Chema Cortes py en ls-l.org
Mar Feb 8 11:57:05 CET 2005


Sebastián Lezica escribió:

>Hola Chema!,
>  
>
>	En teoria el fichero deberia estar correctamente copiado ya que me
>'da permiso' de abrirlo; supongo (es una mera suposición), que el samba esta
>primero ocupando el espacio requerido y luego 'rellenándolo'. Ahora estoy
>probando con tu recomendación, inicialmente voy a aguardar permiso de
>lectura/escritura, y si tampoco lo resuelve paso a abrirlo como
>lectura/escritura (al menos espero me dé una excepción, o algo que pueda
>controlar).
>
>  
>
Como todo en este tipo de situaciones, la culpa siempre es de windows. :-))

Yo te decía que abrieras el fichero como lectura/escritura, ya que es el 
único modo de que tener una excepción si todavía existe algún proceso 
"windows" en al red que no haya terminado de escribir (aún así, puede 
que samba se pase el bloqueo por el forro).

>	Por otra parte, una breve pregunta más... estoy usando una receta
>para leer el teclado sin que se quede aguardando una entrada, que encontré
>googleando (justamente tuya también!, esto es casi un abuso :) !!!)
>utilizando select para comprobar si hay algo en stdin. La pregunta es:
>	¿Puede evitarse la necesidad de pulsar enter para recibir lo
>ingresado por el usuario?. En realidad buscaba alguna forma independiente de
>si la plataforma es Linux o Win, que funcione para detectar en modo consola
>las teclas presionadas por el usuario, pero no encontré nada de nada...
>  
>
La respuesta corta es que no existe. En windows tienes el 
'msvcrt.getch'. Juntando mi receta con el getch de windows puedes 
conseguir un código que, más o menos, valga para windows y linux, algo así:

import sys
if "win" in sys.platform:
    from msvcrt import getch
elif "linux" in sys.platform:
    #utilizamos el código de la "receta" para linux
    from keypress import TerminalFile
    getch=TerminalFile(sys.stdin).getch
else:
    sys.exit(1)

#Bucle de espera mientras no se pulse la techa 'q'
while getch()!='q':
    pass

Advertencia: posiblemente no funcione en IDEs que alteren las entradas 
de teclado (IDLE, pythonwin,...)




Más información sobre la lista de distribución Python-es