Simple logging en python.

Tras muchas idas y venidas con la gestión de logs en python, he llegado a este tutorial de python que resume bastante bien la gestión más básica que se puede hacer en una aplicación con los logs:
En mi caso, los requisitos son:
– El log se guarda en fichero.
– El fichero debe rotar.
– Desde cualquier clase del workspace se puede acceder al log

import logging
import logging.handlers as handlers
 
# Se le puede poner cualquier nombre

logger = logging.getLogger(‘mi_app_name’)
logger.setLevel(logging.INFO)


#Log handler to file:
logHandler = handlers.RotatingFileHandler(‘mi_archivo_salida.log’, maxBytes=1000, backupCount=2)
logHandler.setLevel(logging.INFO)
# output format
formatter = logging.Formatter(‘%(asctime)s – %(name)s – %(levelname)s – %(message)s’)
logHandler.setFormatter(formatter)


logger.addHandler(logHandler)


# Comprobar que todos los logs van al mismo fichero:
logger.info(“Primer mensaje al log de tipo INFO”)
logger.error(“Primer mensaje al log de tipo ERROR”)
En cada clase que se vaya a usar el log, se instancia en el init, y luego se usa como un atributo de la clase:

class ejemplo:
“”” Clase de ejemplo para ver el log “””


def __init__(self):
“””Inicializa el objeto “””
self.logger = logging.getLogger(‘mi_app_name’) # Configurar el log.
 
     def metodo1. (self):
“”” Metodo 1 “””

self.logger.info(‘Mensaje de ejemplo 1’)

 
 
Para saber mucho más sobre los logs en python: https://docs.python.org/3/howto/logging-cookbook.html

Python: Encoding latin-1 utf-8

#!/usr/bin/python
# coding: latin-1

If script is stored in utf-8, a u character has to appear before any utf-8 strings, as in following example:

#!/usr/bin/python
# coding: utf-8

(....)

ws.write_string ("B6",u'Ñéñººª')

For cygwin users, python should be manually pointed at windows python available.

 ln -s  /cygdrive/c/Python27/python.exe /usr/bin/python

If encoding is not set up:

$ python fmyscript.py
  File "fmyscript.py", line 20
SyntaxError: Non-ASCII character '\xc3' in file ficha_conecta.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

To learn more about encoding: https://www.python.org/dev/peps/pep-0263/

 

 

Python: problemas con tildes, ñ, acentos, etc.

#!/usr/bin/python
# coding: latin-1

Si elegimos usar UTF-8, en todas las cadenas que vayan a tener un carácter especial se debe especificar una U delante de la cadena:

#!/usr/bin/python
# coding: utf-8

(....)

ws.write_string ("B6",u'Ñéñººª')

Si el script va a ejecutarse desde cygwin, es necesario apuntar /usr/bin/python a la versión del sistema:

 ln -s  /cygdrive/c/Python27/python.exe /usr/bin/python

Si en los scripts de python, no está bien especificado el tipo de caracteres de los fuentes, ante cualquier carácter especial del castellano aparece el siguiente error:

$ python fmyscript.py
  File "fmyscript.py", line 20
SyntaxError: Non-ASCII character '\xc3' in file ficha_conecta.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Para saber más:  https://www.python.org/dev/peps/pep-0263/

Python 2.7. Instlar pypdfocr en windows

Si al instalar pypdfocr en windows 7, da un error de compilación

$ pip2.exe  install pypdfocr

(...)
Installing collected packages: PyYAML, argh, pathtools, watchdog, httplib2, oauth2, evernote, pypdfocr
  Running setup.py install for PyYAML: started
    Running setup.py install for PyYAML: finished with status 'error'
    Complete output from command c:\python27\python.exe -u -c "import setuptools, tokenize;__file__='c:\\cygwin\\tmp\\pip-build-k7lz4j\\PyYAML\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record c:\cygwin\tmp\pip-nggirp-record\install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build\lib.win32-2.7
    creating build\lib.win32-2.7\yaml
    copying lib\yaml\composer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\constructor.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\cyaml.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\dumper.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\emitter.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\error.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\events.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\loader.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\nodes.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\parser.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\reader.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\representer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\resolver.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\scanner.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\serializer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\tokens.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\__init__.py -> build\lib.win32-2.7\yaml
    running build_ext
    creating build\temp.win32-2.7
    creating build\temp.win32-2.7\Release
    checking if libyaml is compilable
    error: [Error 2] El sistema no puede encontrar el archivo especificado

    ----------------------------------------
Command "c:\python27\python.exe -u -c "import setuptools, tokenize;__file__='c:\\cygwin\\tmp\\pip-build-k7lz4j\\PyYAML\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record c:\cygwin\tmp\pip-nggirp-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in c:\cygwin\tmp\pip-build-k7lz4j\PyYAML\

Es necesario instalar tal y como comentan en stackoverflow vc  para windows :

Microsoft Visual C++ Compiler for Python 2.7

Una vez instalado, vc for Python, debe estar accesible desde el path. Desde command :

cmd_python_pypdfocr

Photosort – Una idea para organizar nuestras fotos

Tenemos un problema tremendo con las fotos. Dos cámaras, dos teléfonos móviles, y un montonazo de fotos sin orden ni concierto. Nuestras necesidades son simples:

Queremos una librería compartida de fotos sin duplicados, ordenadas por fechas

Para ello, el gran Ajo, se ha puesto en marcha y ha creado en python Photosort  disponible en github.Photosort crea una base de datos sencilla, para saber si una foto ha subido ya a nuestro repositorio compartido, incluso si ha subido ya con otro nombre.

También está ya disponible en el repositorio yPi (Python Package Install repository), para que sea mucho más fácil instalarlo en nuestras máquinas.

Se basa en la información exif de la propia foto, y no en la fecha de modificación o creación de las fotos, que puede ser errónea.

Instalación sobre debian 7

apt-get install python-pip
pip install photosort
mkdir ~/.photosort
cd ~/.photosort
wget https://raw.github.com/mangelajo/photosort/master/etc/photosort.yml

Editamos el fichero de configuración yml, con nuestro fuente y nuestro destino. Cuidado con mantener la indentación propia del fichero de yml.

sources:
camera:
dir: '/media/EOS_CAM'
(...)
output:
dir: '/mnt/shared_data/Fotos'
(...)

Con esto, ya podemos ejecutar el comando:

photosort --config .photosort/photosort.yml --debug sync

Para ver qué está haciendo el proceso en cada momento:
tail -f /mnt/shared_data/Fotos/photosort.log