GNOME VFS con Python
GNOME
VFS es una librería para realizar todo tipo de operaciones sobre ficheros independientemente del método de acceso necesario para llegar a ellos (FTP, HTTP, WebDAV, SMB, etc). Esta receta muestra ejemplos de lo sencilla y potente que puede llegar a ser esta pequeña maravilla.
Ingredientes
- python-gnome2
- libgnomevfs2-0
- libgnomevfs2-extra
Introducción
GNOME VFS intenta seguir una semántica lo más parecida posible a la de POSIX, de modo que dispone de open, read, write, seek y todas las primitivas que eran de esperar (aunque puede que en la nueva versión esto cambie bastante).
Para designar un fichero o directorio se utilizan URIs que incluyen:
- Un esquema: ftp, sftp, file, etc
- Un nombre de host
- Una ruta
Partiendo de esta base, es posible realizar gran cantidad de operaciones:
- crear, abrir, copiar, mover, borrar, enlazar
- comprobar existencia, permisos y otros atributos
- leer y escribir el contenido
- listar directorios
- transferencias de múltiples ficheros (incluye mover, copiar, enlazar, etc)
- monitorizar ficheros para reaccionar ante cambios
- operaciones asíncronas
- gestión de volúmenes y discos
Además de cuestiones avanzadas como Zeroconf, DNS, SSL, gestión de MIMEs, etc.
En esta receta incluiré pequeños ejemplos que considere lo suficientemente simples y didácticos, así que esta receta irá creciendo con el tiempo, o eso espero.
Un copy
universal
El siguiente programa (llamado vfs-copy.py
) se puede utilizar para copiar cualquier fichero de cualquier sitio a cualquier sitio (siempre que esos sitios sean manejables por GNOME VFS obviamente):
import sys
import gnomevfs as vfs
if len(sys.argv) != 3:
sys.exit("Usage: %s source target" % __file__)
src_uri = vfs.URI(vfs.make_uri_from_shell_arg(sys.argv[1]))
dst_uri = vfs.URI(vfs.make_uri_from_shell_arg(sys.argv[2]))
print src_uri, '->', dst_uri
vfs.xfer_uri(src_uri, dst_uri,
vfs.XFER_DEFAULT,
vfs.XFER_ERROR_MODE_ABORT,
vfs.XFER_OVERWRITE_MODE_ABORT)
De ese listado todo es autoexplicativo excepto la función xfer_uri()
. El prototipo de esa función es:
gnomevfs.xfer_uri(source_uri, target_uri, options, error_mode, overwrite_mode, progress_callback, data)
que son:
- URIs origen y destino
- operación: copiar, mover, enlazar (ver GnomeVFSXferOptions)
- qué hacer en caso de error
- qué hacer si ya existe el destino
- una función de callback para llamar en caso de error
- datos de usuario asociados al callback
Y ahora vamos a probarlo, todos los comandos siguientes funcionan tal cual con el listado del programa anterior:
$ python vfs-copy.py /home/david/.bashrc mybashrc
file:///home/david/.bashrc -> file:///home/david/devel/mybashrc
$ python vfs-copy.py ftp://ftp.rediris.es/welcome.msg welcome
ftp://ftp.rediris.es/welcome.msg -> file:///home/david/devel/welcome
$ python vfs-copy.py http://ftp.gnu.org/pub/gnu/a2ps/a2ps-4.12.tar.gz#gzip:#tar:/a2ps-4.12/FAQ faq
http://ftp.gnu.org/pub/gnu/a2ps/a2ps-4.12.tar.gz#gzip:/#tar:/a2ps-4.12/FAQ -> file:///home/david/devel/faq
$ python vfs-copy.py ftp://ftp.rediris.es/welcome.msg sftp://david:miclave@miservidor.dyndns.org:/home/david/mensaje
ftp://ftp.rediris.es/welcome.msg -> sftp://david:miclave@miservidor.dyndns.org:/home/david/mensaje