gettext, Python y Windows
Publicado en: abril 19, 2013
Hace mucho tiempo escribí un post sobre como escribir aplicaciones en python que soporten/muestren varios lenguajes usando gettext (incluso después hice otro tutorial para crear una aplicación gráfica multilenguaje que se aprovechaba de esto).
Básicamente lo que hace es ocupar el modulo gettext, el cual lee el lenguaje que utiliza el sistema y a partir de este carga el correspondiente archivo de traducción (*.mo) cambiando las cadenas de texto al idioma del sistema.
Esto funciona de maravilla en sistemas POSIX (linux, la manzana, etc.) pero trae un pequeño problema en windows, ya que gettext usa por defecto las variables de entorno del sistema (como LANGUAGE, LC_MESSAGES, LC_ALL o LANG) para determinar el idioma que se utiliza en el equipo, pero estas variables de entorno por no están presentes en el típico equipo con Windows porque tanto el OS (Windows) como sus aplicaciones nativas obtienen esa información directamente del registro (y por lo tanto no están definidas por defecto).
Es más lo podemos comprobar fácilmente si abrimos el interprete interactivo en Windows:
>>>import os
>>>print os.getenv('LANG')
None
Que regresa un None, ya que por defecto esa variable no existe en Windows (obviamente si se ejecuta en GNU/Linux o cualquier otro tipo POSIX, en vez de None regresaría el idioma por defecto). También lo podríamos comprobar directamente en la linea de comandos de Windows usando SET
Ahora esto tiene una solución bastante simple, usando el modulo locate (de la biblioteca estándar de Python) se puede obtener el lenguaje y codificación que usa Windows por defecto en el equipo y con esa información podemos crear de manera temporal la variable del sistema que necesita gettext.
Es más, se puede utilizar sys para detectar el sistema usado (como lo explique por aquí) y en caso de que sea Windows se crea la variable faltante de forma temporal (la que necesita gettext para funcionar), el código para hacerlo seria algo como esto:
import os
import sys
if sys.platform.startswith('win'):
import locale
if os.getenv('LANG') is None:
lang, enc = locale.getdefaultlocale()
os.environ['LANG'] = lang
Nota: solo lo probé en Windows 7, así que no se si funcionara en Windows mas antiguos (aunque debería funcionar)
Detectando la plataforma en python
Publicado en: abril 6, 2013
- En: python
- 1 Comentario
A mas de alguno le puede servir esto, así que lo posteo. Usando las “pilas incluidas” de Python determinaremos mediante sys cual es la plataforma en que se esta ejecutando el script.
Así que manos a la obra, este código mostrara un mensaje diferente dependiendo de la plataforma en que se ejecute:
#!/usr/bin/python
import sys
plataforma = sys.platform
if plataforma == "linux":
print("hola tux")
elif plataforma == "darwin":
# Estos es la firma de los Mac
print("la manzana mordida")
elif plataforma == "win32":
print("el wintendo")
else:
# Para otros sistemas y variantes de Unix
print("Soy diferente")
Eso si hay un pequeño problema, en versiones de Python anteriores a 3.3 a la respuesta “linux” se le agregaba un sufijo numérico indicando la versión mayor de kernel, así el resultado podía ser “linux2″ o “linux3″ dependiendo del kernel usado (ver este reporte de bug), cosa que no sucede con Python 3.3 o superiores que responde con un “linux” sin ningún numero.
Para arreglarlo en nuestro ejemplo, es mejor comprobando si comienza por “linux” en vez de si se produce una coincidencia exacta. para esto podemos usar el método startswith (que es aplicable a una cadena de caracteres) el cual devuelve True si la cadena comienza por los caracteres facilitados como parámetro.
así cambiamos la linea 7 de:
if plataforma == "linux":
por lo siguiente:
if plataforma.startswith("linux"):
y la detección se realiza correctamente.
control de bucles, break, continue y pass
Publicado en: abril 5, 2013
voy a explicar como se usan y las diferencias entre break y continue para terminar/salir de un bucle y de paso para que sirve pass. Así que vamos con un ejemplo
Break
Este funciona tal como el break de C. Break se puede usas en bucles for y while y simplemente termina el bucle actual y continua con la ejecución de la siguiente instrucción, por ejemplo:
#!/usr/bin/python
# Primer ejemplo
for letra in "Python":
if letra == "h":
break
print "Letra actual :", letra
# Segundo ejemplo
var = 10
while var > 0:
var = var -1
if var == 5:
break
print "Valor actual de la variable :", var
print "fin del script"
que da como resultado:
>>> Letra actual : P Letra actual : y Letra actual : t Valor actual de la variable : 9 Valor actual de la variable : 8 Valor actual de la variable : 7 Valor actual de la variable : 6 fin del script
Si se fijan en el primer ejemplo al llegar a la letra “h” simplemente se termina (rompe) el ciclo (bucle) y se sigue con el segundo ejemplo. En el segundo ejemplo la variable va disminuyendo su valor hasta que llega a 5, en donde se termina (rompe) el ciclo (bucle), mostrando el print final.
consolas web de python
Publicado en: agosto 8, 2010
Me encontré con estos sitios que te permiten usar una consola python via web y ver la salida que produce, puede ser útil para algunas pruebas rápidas.
Estos dos te muestran el interprete y la salida que produce de forma interactiva:
Mientras que estos otros dos nos permiten escribir un script y luego probar como funciona:
- http://pythonwebconsole.thomnichols.org/
- http://codepad.org/ (este también funciona como pastebin y soporta varios lenguajes)
Obviamente por motivos de seguridad tienen algunos modulos algo capados, pero pueden resultar útiles
Tutorial Pygame 4: manejo de figuras y texto (simular el lanzamiento de un proyectil)
Publicado en: julio 14, 2010
- En: pygame | tutoriales
- 3 Comentarios
En esta parte del tutorial se va a simular el lanzamiento de un proyectil (una esfera), para mostrar las siguientes temas:
- Rellenar el fondo con un color especifico
- Dibujar lineas en la pantalla
- Dibujar un circulo
- Sincronizar el movimiento usando tiempo
A continuación la explicación (aunque es recomendable que hayan leído la parte anterior antes de seguir):
Cambiando el user-agent de urllib
Publicado en: abril 13, 2010
Hace algunos días necesitaba cambiar el user agent de urllib (o sea como se identifica urllib al abrir una pagina web) para usarlo en mi script para bajar archivos desde goear. El problema es que normalmente a algunos sitios como google o la wikipedia no les gusta que uno use otras cosas que nos sean navegadores validos para ver sus paginas.
Por ejemplo al hacer una búsqueda en google:
from urllib import urlopen
pag = urlopen("http://www.google.com/search?q=python")
print pag.read()
Nos responde mucho texto (en realidad es el html de una pagina de error), que nos dice :
[...]<H1>Forbidden</H1>Your client does not have permission to get URL <code>/search?q=python</code> from this server.[...]
Ahora si abrimos el interprete en modo interactivo y hacemos:
>>> from urllib import URLopener >>> URLopener.version 'Python-urllib/1.17'
Vemos que por defecto urllib se identifica al abrir alguna pagina (o sea su user-agent) es “Python-urllib/1.17″.
Para cambiarlo por otro valor, consultamos la documentacion de python que nos dice:
To override this functionality, programmers can create a subclass of URLopener or FancyURLopener, then assign an instance of that class to the urllib._urlopener variable before calling the desired function.
Con esto en mente hacemos una pequeña clase que hace el cambio, en donde le señalamos un nuevo user agent (en el ejemplo voy a usar el de IE7, aunque si quieren otros pueden buscar por aquí), quedando el ejemplo de esta manera:
from urllib import FancyURLopener
class MyOpener(FancyURLopener):
version = 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)'
myopener = MyOpener()
pag = myopener.open("http://www.google.com/search?q=python")
print pag.read()
Y ahora si nos responde (nos muestra el html de la pagina) con un lindo:
[...]Results <b>1</b> - <b>10</b> of about <b>36,400,000</b> for <b>python</b> [...]
Claro que se puede usar con cualquier otro metodo de urllib, como por ejemplo con retrieve (para descargar la pagina con los resultados de la búsqueda, en vez de ver el html):
from urllib import FancyURLopener
class MyOpener(FancyURLopener):
version = 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)'
myopener = MyOpener()
myopener.retrieve("http://www.google.com/search?q=python", "resultados.html")
Divertido, ¿o no?
- En: pygame | tutoriales
- 13 Comentarios
Ok, es tiempo de continuar con esta serie de tutoriales de pygame. Si recuerdan en el tutorial anterior cargamos unas imágenes y las mostramos en pantalla, haciendo que se movieran. Ahora vamos a avanza un poco, programando uno de los juegos mas sencillos que pueden existir, el clásico pong.
En esta parte trataremos los siguientes puntos:
- Crear una función para cargar imágenes
- Como crear sprites (los sprites son personajes, objetos, etc. dentro del juego)
- Sincronización de elementos en los videojuegos (¿que son frames por segundo?)
- Controlar un sprite con el teclado
- Controlar un sprite con el mouse
- Colisiones entre elementos (sprites)
- Inteligencia artificial (o la falta de esta)
- reproducción de sonidos (al cumplirse alguna condición)


Últimos Comentarios