Python Mania

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)

Etiquetas:

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.

Etiquetas:

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.

Leer el resto de esta entrada »

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:

Obviamente por motivos de seguridad tienen algunos modulos algo capados, pero pueden resultar útiles :)

Etiquetas:

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):

Leer el resto de esta entrada »

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?

Etiquetas:

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)

Leer el resto de esta entrada »

Etiquetas: ,
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 31 seguidores