python

Lanzar comandos de consola con python y paramiko

A veces, desde una web o un script de python, necesitamos poder ejecutar comandos de consola. Para lanzar comandos tenemos 2 formas, una es ejecutar directamente en la consola mediante system y la otra es utilizar un cliente de ssh como paramiko.

En el paquete os tenemos una función llamada system que ejecuta directamente un comando como en consola pasandole como parámetro el comando a ejecutar. Este es el ejemplo más sencillo que podemos hacer. Aunque hay otras formas como por popen, creo que para cosas sencillas es mas rápido os.system. Recordad que hay que importar el paquete os antes de usarlo.

Otra forma de ejecutar comando de consola es hacer uso de paramiko, un magnífico cliente de ssh para python. Con paramiko, podremos hacer uso desde python de conexiones por ssh y sftp, por lo que podremos trabajar directamente contra servidores linux de una forma sencilla. Decir que paramiko no viene por defecto con python y deberéis instalarlo de la página oficial de paramiko o con pip. Recordad también que para utilizar paramiko es recomendable configurar claves ssh para acceder sin contraseña. Para establecer una conexión por ssh con paramiko utilizaremos paramiko.SSHClient para crear un nuevo cliente ssh al que posteriormente conectaremos a un servidor con unas credenciales y por último utilizaremos client.exec_command con nuestro comando a ejecutar. Como veis esto es muy sencillo, aunque puede complicarse por temas de claves, permisos y demás. Ahora unos ejemplos.

Os dejo a continuación un ejemplo de ejecución de un comando por consola:

import os

os.system("cp -r directorio1 directorio2")

Os dejo un ejemplo de conexión con paramiko:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("miserver", username="miusuario", password="mipass")

stdin, stdout, stderr = client.exec_command("cp -r directorio1 directorio2")

Lenguajes de programación semánticos (python) contra matemáticos (c#)

Hace tiempo escribí un artículo en el que hablaba de frameworks web para programar y fui criticado por criticar django. Bueno como aclaratoria, escribo este artículo, en el que detallo las diferencias de los programadores, una gran batalla entre lenguajes semánticos vs matematicos; en este caso python vs c#.

Veamos primero que es cada uno, un lenguaje semántico es un lenguaje de programación que pretende ser similar a un lenguaje real, como el español, inglés, etc. mientras que un lenguaje matemático es mas parecido a ecuaciones con llaves, corchetes, paréntesis, etc. Pero veamos mas diferencias, un lenguaje semántico, sea cual sea, persigue el «de un vistazo», generalmente esta ausente de llaves y basa su estructuración en identación y estructuras muy semánticas como delimitadores de texto. Para este caso tenemos como ejemplo a VB, en el que terminamos un if con un End If, un for con un Next, etc. la identación automática que propone el propio ide de programación o como en el caso de Python, la identación es necesaria para que el interprete de Python entienda el código.

Un lenguaje matemático es en contra de un lenguaje semántico, un lenguaje de formulas y ecuaciones, que sin tener unas nociones de matemáticas y que estas nos gusten se nos pueden atragantar bastante. A diferencia de lo que ocurre en los lenguajes semánticos, este tipo de lenguajes a pesar de que la identación suele ser importante para la claridad y el entendimiento, también nos permite escribir todo nuestro código en una sola línea. Las funciones suelen estar delimitadas por llaves {} así como las clases y namespaces. Las lineas de un lenguaje matemático suelen estar delimitadas por puntos y coma «;», y como mencione antes, al tener delimitadores de linea todo el código puede estar en una única linea, como ocurre en el caso de los frameworks de javascript que comprimen su código hasta que ocupe una única linea.

¿Pero qué es mejor? Pues depende de la persona, igual que hay zapatillas para los corredores según su tipo de pisada, hay lenguajes según como programes. Hay programadores que son mas de letras, les gusta ver su código y creer que están leyendo un libro. Para ellos, un lenguaje semántico es ideal, un python o un visual basic. Para aquellos programadores que como me ocurre a mi, nos gusta ver una cierta simetría en nuestro código y que al ver el código parezca una libreta de un matemático, lleno de formulas, lenguajes como c# o java, son para mi.

¿Y cual es mejor? Pues ninguno. Lo mas importante es sentirse a gusto con el entorno con el que se trabaja. Si por ejemplo, eres un matemático puro, python es horrible, pero no quiere decir que no lo puedas utilizar. Por contra, si eres muy semántico, c# sería incomprensible. A la hora de trabajar, hay que tener en cuenta 3 factores básicos. En primer lugar en que lenguaje nos sentimos mas cómodos. Evidentemente no vamos a programar como no nos gusta (salvo que nuestro jefe nos lo diga). En segundo lugar hay que saber elegir bien el lenguaje con sus herramientas. En Lenguajes como PHP tenemos multitud de librerías y aplicaciones ya desarrolladas, en python django tenemos muchos módulos, etc. en c# el deploy es muy sencillo, pero no se nos ocurriría hacer una web en shell script por ejemplo, ya que no tenemos el mismo potencial de librerías. Por último hay que elegir sabiamente según lo que vayamos a hacer. Si por ejemplo vamos a desarrollar una pequeña aplicación, con un PHP vamos sobrados, si queremos generar una página sencilla, podemos utilizar django, pero si queremos hacer una aplicación grande y escalable, quizás c# nos convenga mas. Hay que saber equilibrar todo estos puntos para elegir siempre la mejor opción según lo que vayamos a desarrollar.

Yo programo las aplicaciones prefabricadas (wordpress, prestashop, etc) o páginas muy muy sencillas en PHP, otros proyectos a medida de mayor envergadura pero pequeños en python con django o pylons y los grandes proyectos en c# con mono aspnet mvc y AltairStudios.Core. Y tu, ¿En qué programas?

Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC

Hace un tiempo empecé a oír hablar de django y empecé a interesarme por el. La verdad que al principio me llamaba mucho la atención porque la gente no hacia mas que alabar las virtudes de django. Investigando encontraba mas y mas alabanzas, incluso expertos que comparaban django con otros entornos como Mono ASP.Net con MVC o ruby.

A veces las comparaciones son odiosas y esto es que lo les pasa a los demás entornos cuando los comparamos con django. Al comparar django con Mono ASP.Net con MVC, comentaban como un mismo proyecto realizado por programadores expertos en django, realizaban muchas mas tareas que los expertos en ASP.Net en el mismo tiempo y que el resultado final del proyecto es que era mas rápido y consistente el desarrollo en django que en ASP.Net. Yo no digo que django sea un mal entorno, ni que los programadores de ASP.Net sean malos, pero la calidad de un programador de .Net realizando una web deja un poco que desear en la mayoría de los casos, no asi un programador friki de python que ha decidido hacer webs y que seguramente sea mucho mas versátil que uno de asp.net aunque hiciera la web en php y para mi esto no es comparable. Por otro lado comparaban django con ruby y no me gusto nada la comparación, ya que al comparar, decían que ruby on rails era para “nenas” y django para “hombre de pelo en pecho”. La verdad que esta comparación, es un poco ridícula, hasta llego a hacerme gracia a pesar de no gustarme.

Ahora vayamos a mi experiencia personal. Decidí instalarme django, ruby y Mono ASP.Net con MVC. Al buscar información, tutoriales o algo de guía para instalar e iniciar django, me encuentro con poca información y además centrada para linux, seguía las guías para mac y me costo sudor y lágrimas hacerlo correr (mi amigo @saikus no fue capaz). Cuando ya conseguí, intente hacer una prueba pero fui incapaz, bastante complicado para empezar sin un libro o sin que alguien te enseñe. Aun así, vi que utiliza una especie de servidor propio, por lo que para por ejemplo hacerlo correr en apache, hay que arrancarlo desde ssh y enlazarlo por un fastcgi o similar con apache, pero la cuestión es, cuanta comunidad puede generar algo que es muy muy muy dificil que sin ser pro y sin gastar un dineral en hosting, puedan hacer pruebas (yo en mi hosting no puedo instalarlo de momento).

Por ejemplo, mi experiencia con ruby o asp.net es muy mas satisfactoria, puesto que ruby es tan fácil como instalarlo desde algún apt-get, ports, descargable, etc y luego instalar las mil y una gemas necesarias. De una forma rápida y fácil puedes hacer funcionar un ejemplo o programar algo no solo en linux, sino en MacOSX, que es importante, ya que cada vez hay mas gente que usa este sistema. Por otro lado Mono ASP.Net con MVC es también muy fácil, quizás algo mas complejo que ruby, pero tan fácil como bajarse el instalable o en el peor de los casos las fuentes de la web de mono y compilar. Mono ya tiene XSP que es su propio server como ocurre con django y rails, y con mod_mono lo compilamos e instalamos en un periquete en apache.

Por que me gusta mas usar Mono ASP.Net con MVC que usar ruby o django. Django lo descarto por el costo de su instalación, porque no tengo un buen IDE donde poder programarlo y si quisiera pagar aunque fuera poco por los IDES, ¿Por qué no volverme a Windows y usar Visual Studio? Ruby es un poco parecido, es mas fácil de instalar y trabajar, pero falta un buen IDE, Netbeans tiene soporte, al igual que Eclipse para django, pero son plugins para mi gusto no estan muy muy depurados. Por el lado de Mono ASP.Net con MVC tenemos la opción de monodevelop, que si bien es cierto que sus primeras versiones eran como los plugins antes mencionados, las ultimas han mejorado sustancialmente y no hay que olvidar que en lugar de ser un IDE de java con plugins para python o ruby, es un IDE de .Net (dotnet), por lo que mvc esta soportado nativamente.

En conclusión, a django le veo demasiadas pegas que ensombrecen las virtudes que tiene. Ruby es quizás el mas equilibrado en cuanto a potencia y tiempo de desarrollo y Mono ASP.Net con MVC es mas lento en cuanto a desarrollo pero muy potente, además de no ser un framework añadido a un lenguaje (mvc si, pero no asp) sino todo un entorno preparado para la web, donde con un par de clicks es muy fácil generar clientes de servicios web, o crear un servicio web xml, una pagina web o mil cosas mas. Es por esto que yo personalmente me quedo con Mono ASP.Net con MVC.

Scroll al inicio