pygtk: como pedir confirmación al usuario

A veces en una aplicación PyGT necesitamos pedir al usuario que nos confirme una acción, con esta pequeña función tendremos la solución. Se le pasa como parámetros el texto a monstrar y el título de la ventana.

def pedir_confirmacion(texto,titulo):
    dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL,gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO,texto)
    dialog.set_title(titulo)
    response = dialog.run()
    dialog.destroy()
    if response == gtk.RESPONSE_YES:
        print "A respondido que sí!"
        return True
    else:
        print "A respondido que no!"
        return False

Vía ubuntu forums

Notas sobre programación de aplicaciones de escritorio en python: teoría y práctica

Alguna vez he programado alguna cosa en pygtk por divertimento. Una vez tuve que adaptar el instalador de Ubuntu (ubiquity) para un proyecto del trabajo y me tocó pelearme otra vez con python+gtk. Ahora quería mirar una manera sería de hacer desarrollos de aplicaciones de escritorios en python GTK, así que lo primero es recopilar información y este ha sido e resultado:

Continue reading

Como modificar entradas LDAP desde python

En un server que corre Zenntyal necesitaba cambiar el interprete de comandos que se les habñia asignado a todos los usuarios creados en el LDAP. Para ello me he decidido a usar python (porque es lo que mejor controlo y por el magnífico interprete iPython). El resultado a sido este:

#importamos el módulo LDAP y nos conectados
import ldap
l = ldap.initialize('ldap://localhost')
l.simple_bind('cn=ebox,dc=cajacomun,dc=es','misecreto')

#importamos modlist y creamos el cambio
from ldap import modlist
old = {'loginShell':'/bin/false'}
new = {'loginShell':'/bin/bash'}
cambios = modlist.modifyModlist(old,new)

#buscamos personas y aplicamos el cambio
for person in l.search_s('ou=Users,dc=cajacomun,dc=es',ldap.SCOPE_SUBTREE,'(uid=*)',['loginshell']):
    print person
    l.modify_s(person[0],cambios)

Más info:

Empaquetado deb rápido y sucio de aplicaciones python

Ieup,

Toca mini-receta basado en el artículo de David en la web de crysol.

  1. Necesitamos un fichero setup.py. Si el software no lo trae deberemos crearlo nosotros.
  2. creamos el dir debian: mkdir debian
  3. Creamos el fichero debian/control:

  4. Source: hola-pythoneros
    Section: utils
    Priority: optional
    Maintainer: Juan Nadie <juan.nadie@loquesea.es>
    Build-Depends: debhelper (>= 5.0.38)
    Build-Depends-Indep: cdbs (>= 0.4.43), python-all-dev (>= 2.3.5-11), python-central (>= 0.5.6)
    Standards-Version: 3.7.2
    XS-Python-Version: all


    Package: hola-pythoneros
    Architecture: all
    Depends: ${python:Depends}
    XB-Python-Version: ${python:Versions}
    Description: Ejemplo básico de script Python empaquetado en Debian GNU/Linux
    Un script "hola mundo" que sirve únicamente para explicar cómo se
    empaquetan scripts Python en GNU/Linux de forma adecuada.

  5. Creamos el rules (ojo, tiene que ser ejecutable chmod +x debian/rules):

  6. #!/usr/bin/make -f


    DEB_PYTHON_SYSTEM=pycentral
    DBK2MAN_XSL=/usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl


    include /usr/share/cdbs/1/rules/debhelper.mk
    include /usr/share/cdbs/1/class/python-distutils.mk

  7. Creamos el debian/changelog : dch --create

Con esto tenemos lo ultrabásico para poder compilar el paquete deb: dpkg-buildpackage

Es una manera sucia de empaquetar algo (es más una nota mental para mi que un howto) y para que el paquete sea medio decente hay que hacer muchas más cosas 🙂 Leeros el articulo de David que es más completo.

Como procesar un fichero .changes de un paquete debian

Buenas,

Si queremos procesar un fichero .changes de un paquete debian es tan sencillo como:

  1. Quitarle la firma
  2. Procesar el contenido con una librería de yaml, por ejemplo syck

En código sería lo siguiente:

import os
import GnuPGInterface
import syck

changes_file = '/tmp/factoriapegaso-panel_0.2.6-4_amd64.changes'

gnupg = GnuPGInterface.GnuPG()
ciphertext = open(changes_file).read()
p2 = gnupg.run(['--decrypt'], create_fhs=['stdin', 'stdout'])
p2.handles['stdin'].write(ciphertext)
p2.handles['stdin'].close()
decrypted_plaintext = p2.handles['stdout'].read()
p2.handles['stdout'].close()
#Puede fallar por no tener la llave GPG
try:
        p2.wait()
except:
        pass

changes_info = syck.load(decrypted_plaintext)


print "tenemos:"
print changes_info

No es lo mas elegante del mundo, solo una prueba de concepto 🙂

Howto parse a debian changes file in python

Firts post in English (just a test :). If yo want to parse a debian package changes file in python is so easy as:

import os
import GnuPGInterface
import syck

changes_file = '/tmp/factoriapegaso-panel_0.2.6-4_amd64.changes'

gnupg = GnuPGInterface.GnuPG()
ciphertext = open(changes_file).read()
p2 = gnupg.run(['--decrypt'], create_fhs=['stdin', 'stdout'])
p2.handles['stdin'].write(ciphertext)
p2.handles['stdin'].close()
decrypted_plaintext = p2.handles['stdout'].read()
p2.handles['stdout'].close()
#Puede fallar por no tener la llave GPG
try:
        p2.wait()
except:
        pass

changes_info = syck.load(decrypted_plaintext)


print "tenemos:"
print changes_info

Control del flujo tipo switch en python

Ieup,

Otra pildorita de Python. Siempre echaba de menos una orden de control del flujo del tipo switch de PHP. Hasta ahora siempre hacía un sucio hack con if-s anidados (si asi de WTF es uno :P). Pero hoy, cansado ya y con necesidad urgente he rebuscado en san google y he encontrado que se puede hacer tan sencillo como mapeandola funciones a valores en un array. Sacado del blog de Simon Willson :

#Definimos las funciones
def alerta(texto):
        print "ALERTA: %s"%texto
def farsa(texto):
        print "FARSA: %s"%texto
#Definimos el array mapeador
case = {
    'a': alerta,
    'f': farsa
    }
variable='a'
print variable
case[variable]("lala")
print "Ahora cambiamos"
variable='f'
print variable
case[variable]("lele")

Gestión de “opciones” en guiones python

Python mola! Necesitaba añadir a un guión python el recibir un parametro del tipo –parametro valor. He mirado la referencia de python (ya sabeis, hay que mantenerla siempre debajo de la almohada 😉 y voila! optparser al rescate. A sido tan sencillo como:

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-c", "--config",action="store", type="string", dest="configfile")
(options, args) = parser.parse_args()
#Es oblligatorio indicar el fichero de configuración
if not options.configfile:
    print "Falta indicar el fichero de configuración"
    exit()
#esperamos 2 parámetros libres
if len(args) != 2:
    print "Faltan parametros"
    exit()

Espero que a alguna le sirva. Sino sirva como nota mental 🙂

Agur.