Uno de los puntos más fuertes de este lenguaje es el trabajo con los protocolos de red, entre los cuales podemos mencionar el FTP y algo más usual como lo es el email, con ello podemos desarrollar programas o aplicaciones que nos permiten subir archivos a equipos remotos de forma automatizada si así lo deseamos, todo sin necesidad de recurrir a otras herramientas fuera del ecosistema de Python.
El protocolo FTP
El protocolo FTP nos permite hacer transferencias de archivos a través de una conexión en una red. Normalmente es el protocolo que utilizamos para conectarnos de forma remota a servidores y de esta forma manipular archivos, usualmente se utiliza el puerto 21, sin embargo esto es totalmente a gusto del consumidor por lo que si vemos otro puerto no es de extrañar que sea una instalación personalizada.
Para poder hacer interacción con este protocolo necesitamos dos cosas, la primera es un servidor que esté al aire y disponible para nuestra red, puede estar en la misma red o tal vez en Internet. Lo segundo que se necesita es un cliente que pueda enviar y recibir información de dicho servidor, este cliente debe tener la capacidad de poder utilizar los puertos especificados por el servicio y la autenticación establecida.
La librería ftplib
Realizar un cliente en Python que pueda hacer conexión FTP desde cero es posible, sin embargo el esfuerzo que eso nos tomaría sería algo considerable y al final puede ser en vano si no necesitamos algo en especial.
Para evitarnos molestias y desarrollo innecesario Python nos provee de una librería que ya nos ayuda con gran parte del trabajo. Estamos hablando de ftplib, esta contiene métodos completos y ya probados y depurados que nos facilitan la comunicación utilizando el protocolo de transferencias de archivos FTP.
Escogemos este servidor debido a que no necesita autenticación y nos permite utilizar el modo anónimo. Veamos entonces el código y luego haremos la explicación correspondiente, el único requisito que necesitamos es tener Python 2.7 y conexión a Internet:
#!/usr/bin/env python RUTA_SERVIDOR_FTP = 'ftp.kernel.org' import ftplib def cliente_ftp_conexion(servidor, nombre_usuario, correo): #hacemos la apertura de la conexion ftp = ftplib.FTP(servidor, nombre_usuario, correo) #listamos los archivos del directorio /pub ftp.cwd("/pub") print "Archivos disponibles en %s:" %servidor archivos = ftp.dir() print archivos ftp.quit() if __name__ == '__main__': cliente_ftp_conexion(servidor=RUTA_SERVIDOR_FTP, nombre_usuario='anonymous', correo='nobody@nourl.com', )
Lo primero que hacemos es definir una variable dentro del archivo que va a contener la ruta del servidor FTP al cual deseamos hacer la conexión, en este caso es ftp .kernel.org, aquí es donde podremos obtener información del kernel de Linux.
Acto siguiente hacemos el import de la librería ftplib antes mencionada, con ello nos aseguramos la posibilidad de utilizar todos los métodos necesarios para conectarnos al servidor antes definido, para ello utilizamos el método FTP de la misma, ahí pasaremos la ruta, el nombre de usuario y un correo.
Este código debe ir en un archivo del nombre que deseemos con extensión .py de manera que nuestro interprete Python pueda ejecutarlo, para ello en la ruta donde se encuentre nuestro archivo lo ejecutamos con la palabra reservada python y el nombre de nuestro archivo, lo cual nos debe dar algo similar a lo que vemos en la siguiente pantalla:
Subir un archivo vía FTP
Si bien en el ejemplo anterior podemos listar los archivos de un servidor, lo cual es bastante útil para obtener información de los mismos, algo más poderoso es poder subir archivos. Las utilidades de esto son muchas, podemos contar por ejemplo la transferencia de archivos resultantes de una aplicación para su procesamiento desde otra, o tal vez hacer respaldos de un equipo en otro que se encuentre dentro de la red. Por supuesto en la actualidad tal vez hayan soluciones mucho más elegantes, sin embargo no está demás poder lograrlo con una aplicación que desarrollemos nosotros mismos.
Sea cual sea el servidor que podamos utilizar debemos tener permisos o la posibilidad de hacer un acceso anónimo, de todas formas en el código siguiente veremos de mejor forma como podemos hacer la subida de archivos.
Debemos crear un usuario y una cuenta FTP en el servidor local que creemos para poder hacer uso de este ejemplo, también funciona con servidores remotos, simplemente debemos asegurarnos de tener nuestras credenciales actualizadas. Luego podemos utilizar el siguiente código:
#!/usr/bin/env python import os import argparse import ftplib import getpass SERVIDOR_FTP_LOCAL = 'localhost' ARCHIVO_A_SUBIR = 'ejemplo.txt' def subir_ftp(servidor, nombre_usuario, password, archivo_subir): print "Haciendo conexion con el servidor: %s" %servidor ftp = ftplib.FTP(servidor) print "Iniciando sesion como: usuario=%s" %nombre_usuario ftp.login(nombre_usuario, password) ext = os.path.splitext(archivo_subir)[1] if ext in (".txt", ".htm", ".html"): ftp.storlines("STOR " + archivo_subir, open(archivo_subir)) else: ftp.storbinary("STOR " + archivo_subir, open(archivo_subir, "rb"), 1024) print "Archivo subido: %s" %archivo_subir if __name__ == '__main__': parser = argparse.ArgumentParser(description='Ejemplo de subida de archivos FTP') parser.add_argument('--servidor', action="store", dest="servidor", default=SERVIDOR_FTP_LOCAL) parser.add_argument('--archivo', action="store", dest="archivo_subir", default=ARCHIVO_A_SUBIR) parser.add_argument('--usuario', action="store", dest="nombre_usuario",default=getpass.getuser()) parametros_aplicacion = parser.parse_args() servidor, archivo_subir, nombre_usuario = parametros_aplicacion.servidor, parametros_aplicacion.archivo_subir, parametros_aplicacion.nombre_usuario password = getpass.getpass(prompt="Ingresa el password: ") subir_ftp(servidor, nombre_usuario, password, archivo_subir)
En este ejemplo además de importar la librería ftplib, también importamos las librerías os para poder acceder a comandos del sistema operativo, adicionalmente utilizamos argparse y getpass para poder procesar el uso de parámetros introducidos por el usuario y así dotar de mayor dinamismo a nuestro programa.
Luego definimos un par de constantes con las cuales vamos a establecer el servidor y un archivo de ejemplo que subiremos a la carpeta definida por nuestro usuario FTP. El siguiente paso es abrir la conexión FTP, sin embargo en este caso si utilizaremos un nombre de usuario y contraseña, ya que en teoría estamos accediendo a un servidor con autenticación no anónima, esto más que todo es por motivos de seguridad y también para mostrar que nuestro ejemplo funciona en otros casos.
Continuamos evaluando la extensión de nuestro archivo, con ello veremos si es un archivo de texto, para ello utilizamos storlines(), con lo que no afectaremos el contenido del mismo, en caso de ser otra extensión diferente a las definidas utilizaremos el método storbinary() para poder pasar el archivo de forma original con su contenido binario logrando así no corromperlo y que pueda seguirse utilizando.
Finalmente utilizamos argparse() para poder tomar los argumentos que un usuario puede introducir para utilizar nuestro programa, haciendo la salvedad que si este no coloca valores se tomarán los valores globales definidos dentro de nuestro programa. Ejecutamos nuestro programa y si todo ha salido de correctamente podremos ver la siguiente salida en nuestra consola:
Notamos que en este caso el parámetro usuario es el único que utilizamos, ya que en nuestro servidor tenemos un usuario llamado prueba-python, luego introducimos el password asignado a dicho usuario y la subida del archivo es realizada efectivamente.
Con esto finalizamos este tutorial, hemos aprendido como hacer una conexión FTP desde un programa hecho en Python, lo importante acá es notar como con métodos que provienen de la librería estándar de Python hemos logrado realizar funcionalidades que de otra forma nos hubiese tardado mucho tiempo, aparte de la gran cantidad de código que habría que generar. Recomendamos seguir investigando en la documentación oficial de la librería ftplib, de esta manera subiremos de forma importante nuestras habilidades en el mundo Python, abriéndonos así las puertas a ser más efectivos como desarrolladores en este mundo tecnológico de tanta competencia.