Posts etiquetados ‘python’

Python en Apache 2 (para tarados)

Febrero 4, 2009

Solo para no buscar por Google como un tarado por enésima vez:

Para correr scripts hechos en Python y Ruby en Apache2 sin recurrir a mod_python (corriendo sobre Ubuntu o Debian-símiles).

Editar: /etc/apache2/sites-available/default

o el sitio que corresponda.

Agregar en ls sección <Directory /var/www > o donde correponda

AddHandler cgi-script .rb
AddHandler cgi-script .py

El resto es obvio:

  • reiniciar el servidor ( /etc/init.d/apache2 force-reload o restart)
  • que los scripts tengan permiso de ejecución
  • que tengan al inicio la línea de arranque (es mejor  #!/usr/bin/env python o ruby según corresponda)
  • eventulamente editar en la configuración del directorio el permiso para ejecutar cgis en la parte de Options agregando +ExecCGI )

La siguiente vez que lo busque como un tarado y lo encuentre en mi propio blog, prometo postearlo en los comentarios de forma recursiva hasta envejecer.

Pylint: chequear código escrito en Python

Enero 31, 2009

Dado que la calidad de mi código siempre dejó mucho que desear (ausencia de comentarios, estilo desprolijo, etc),Pylint me viene como anillo al dedo cuando hago algo en Python. El problema es que la configuración que trae por defecto no me gusta: hace que salten alertas sin motivo y me llena de reportes que no necesito. Básicamente cuando escribo quiero que me alerte sobre aquellas cosas que lo ameriten y que me muestre nada más el puntaje que le da a mi código. Me marco como meta un código con puntaje superior a 9 y libre de bugs.

Cambios en la configuración de Pylint

1. En el directorio $HOME (/home/usuario/) teclear:

pylint --generate-rcfile > .pylintrc

Con eso se genera un archivo de configuración que queda oculto (por el punto delante del nombre de archivo) en uno de los lugares donde pylint va a buscar por defecto un archivo de configuración.

2. Edito el archivo generado:

nano .pylintrc

3. Edito las siguientes líneas asignando los siguientes valores:

# Disable the message(s) with the given id(s).
disable-msg=C0103
# Include message's id in output
include-ids=yes
# Disable the report(s) with the given id(s).
disable-report= R0801, R0701, R0101, R0001, R0003
# Maximum number of characters on a single line.
max-line-length=100

Con eso obtengo un reporte limpio con un puntaje asignado al código.

Pueden encontrar más documentación sobre pylint en su directorio de documentación (en Ubuntu es /usr/share/doc/pylint) que si lo abren desde el navegador pueden encontrar unas útiles páginas con faq y características completas del programa.

Mantengo una pestaña del navegador apuntando al reporte generado para actualizarlo y leer la última versión.

El reporte lo genero tecleando:

pylint nombre_del_programa.py > reporte.txt

Si teclean:

pylint -f html nombre_del_programa.py > reporte.html

les queda en formato…  HTML  ;-)

Python y MySQL desde PHP

Enero 14, 2008

Estaba reconvirtiendo un programita hecho en PHP a Python.
Estaba acostumbrado a hacer:

function datos($tabla,$campo,$clave){
$sql_det = 'SELECT * FROM '.$tabla.' WHERE '.$campo.'="'.$clave.'"';
$res_det = mysql_query($sql_det);
return mysql_fetch_array($res_det);

Sin embargo, al intentar hacer lo mismo en Python

def consulta(sql):
db = MySQLdb.connect(host="localhost",user="xxxl",passwd="xxx",db="xxxx")
cur = db.cursor(MySQLdb.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchall()
return res

Me devuelve un array que requere de un índice entero para referirse a él. Yo estaba acostumbrado a referirme a los campos por su nombre.
Buscando por ahí, encontré la solución que espero sea útil para quien tenga similares problemas:

def consulta(sql):
db = MySQLdb.connect(host="localhost",user="xxxl",passwd="xxx",db="xxx")
cur = db.cursor(MySQLdb.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchall()
return res

El original fue encontrado en “Will code for food“.

Modificaciones al script

Enero 12, 2008

Hice algunas modificaciones al código del script mencionado anteriormente:

 result = re.findall('www\.youtube\.com/v/([A-Za-z0-9_\-]+)', data)
  done_files = []
  # BEGIN proposed changes
  # check if saved directory exists
  line=""
  if os.path.exists('defaultdir.txt'):
    # if file exists load its content
    f = open('defaultdir.txt','r+')
    line = f.readline()
    if line=="":
        # if the file is empty, then default is home directory
        line="~"
    f.close()
  rootdir_pipe = os.popen('kdialog --title "Save file(s) in..." --getexistingdirectory '+ line)
  root_dir = rootdir_pipe.read().strip()
  print root_dir
  f = open('defaultdir.txt','w')
  # save selected path
  f.write(root_dir)
  f.close()
  # END of proposed changes
  for video_id in result:
    if video_id not in done_files:

Se lo voy a mandar al autor, a ver si le gusta.
La idea es permitir tener un directorio por defecto.

Bajar videos de Youtube con Konqueror

Enero 12, 2008

Encontré este add-in para Konqueror para bajar Y codificar videos de you tube. El programa está hecho en python y es un lindo ejemplo de add-in para Konqueror. Por el momento no logra codificar bien desde FLV a MPG, pero sospecho que es un bug del encoder no del script.