eliluminado
Usuario (Argentina)
Registrate y eliminá la publicidad! Continuando lo que empece. Este esta titulado: Silogismos

Ocultando archivos en GNU/Linux Una de las facilidades que nos ofrece lo sistemas basado en Unix es su facilidad para configurarlo sin tener que tocar un gran y sobrecargado registro (haciendo referencia a Microsoft Windows) sino que modificando simple archivos de texto podemos ajustar las preferencias de nuestros programas o de nuestro sistema, un ejemplo de esto es la forma como se oculta un archivo y/o carpeta en los sistemas basado en Unix porque simplemente anteponiéndoles un punto al nombre del archivo este se vuelve un archivo oculto para el sistema. Viendo esta facilidad para ocultar un archivo en nuestra distribución Linux, practiquemos un poco con Python creando un pequeño pero funcional script que oculte un archivo. Comencemos planteando como llevar nuestra necesidad de ocultar un archivo en GNU/Linux con Python, por ahora tenemos dos cosas como para comenzar una es que nuestra función tiene que tomar un archivo como parámetro para funcionar y la otra es como se oculta un archivo, llevándolo al papel nos quedaría algo así como para orientarnos en la construcción de la función: 1 - Entra como parámetro un archivo 2 - Si ya esta oculto no se realizaría ninguna acción 3 - Si no esta oculto colocamos como primer carácter en el nombre un punto Habiéndolo planteado empecemos por el punto numero 1, nuestro Linux no discrimina si se trata de un archivo o de una directorio utiliza el mismo método para ocultarlos así que comprobar con que estamos trabajando podemos dejarlo de lado por un momento, algo que si es importante es que obviamente el archivo debe existir. Para comprobar la existencia del archivo podemos tomar como referencia lo visto en "Tres formas de comprobar la existencia de un archivo" utilizando la primer forma, ya que como mencione no estamos discriminando si se trata de un archivo o una carpeta y no tendría ningún sentido utilizar la segunda forma. La primer forma para comprobar la existencia de un archivo que vimos fue esta: dijo: archivo = "/usr/bin/firefox" def checkfile(archivo): import os.path if os.path.exists(archivo): print "El fichero existe" else: print "El fichero no existe" Como podrán ver cumple con su objetivo y nos va a servir para mas adelante, por ahora dejemoslo y sigamos con la segunda parte de nuestro ocultador de archivos para sistemas tipo Unix. Lo segundo en nuestra lista es "Si ya esta oculto no se realizaría ninguna acción" pero para esto tenemos que tener en cuenta dos factores importantes uno es con que archivo o carpeta estamos trabajando realmente y lo segundo es como saber si el primer carácter es un punto y en consecuencia de que se trate de un archivo ya oculto, paso a explicar lo primero que mencione sobre como saber con que estamos trabajando realmente, supongamos que el usuario pasa como parámetro la siguiente ruta a un archivo "/usr/bin/firefox" uno fácilmente puede deducir que se puede tratar de un archivo o una carpeta que se llama "firefox" y de que "/usr/bin/" es la ruta al mismo y que es con lo que debemos trabajar, pero como hacemos para que Python discrime esto y sin intervención nuestra para superar este inconveniente. Para lograr esto tenemos dos formas una con 'os.path.split' y la otra con 'os.path.basename', paso a explicar las diferencias de cada uno así como sus ventajas y sus desventajas: * 'os.path.split': Su espacio en la documentación de Python: http://docs.python.org/library/os.path.html#os.path.split Información extraída de The Python Standard Library: dijo:Split the pathname path into a pair, (head, tail) where tail is the last pathname component and head is everything leading up to that. The tail part will never contain a slash; if path ends in a slash, tail will be empty. If there is no slash in path, head will be empty. If path is empty, both head and tail are empty. Trailing slashes are stripped from head unless it is the root (one or more slashes only). In all cases, join(head, tail) returns a path to the same location as path (but the strings may differ). Paso a explicar que es lo que hace esta función, la función toma una ruta como argumento y devuelve una tupla con dos valores uno de ellos es el directorio donde se encuentra el archivo con el que estamos trabajando y por otro lado devuelve también el nombre de archivo o carpeta, así que nos devuelve dos valores uno es el directorio del archivo y el otro es el archivo. Pongamoslo en un ejemplo para darnos cuenta de lo que hablamos: dijo: >>> import os.path # Obviamente deberemos importar el modulo para poder utilizarlo >>> file = "/usr/bin/firefox" # El archivo a analizar >>> os.path.split(file) # La función que hará todo el trabajo con la ruta como argumento ('/usr/bin', 'firefox') # Acá podemos ver la salida de la función >>> Como observaran el primer valor es el directorio y el segundo es el archivo, así que podemos asignar esta tupla en dos variables con los valores en cuestión quedándonos algo parecido a esto: dijo: >>> import os.path >>> file = "/usr/bin/firefox" >>> split = os.path.split(file) # Esta ves asignamos salida de la función a una variable >>> ruta = split[0] # En estas dos lineas asignamos las variables que les mencionaba >>> archivo = split[1] >>> print "La ruta es %s y el archivo %s" % (ruta, archivo) La ruta es /usr/bin y el archivo firefox >>> * 'os.path.basename': Su espacio en la documentación de Python: http://docs.python.org/library/os.path.html#os.path.basename Información extraída de The Python Standard Library: dijo:Return the base name of pathname path. This is the second half of the pair returned by split(path). Note that the result of this function is different from the Unix basename program; where basename for '/foo/bar/' returns 'bar', the basename() function returns an empty string (''). Esta función también toma como argumento la ruta con la que deseamos trabajar y nos devuelve el archivo o carpeta a donde apunta la ruta que pasemos como parámetro, veámoslo en acción: dijo: >>> import os.path # Obviamente deberemos importar el modulo para poder utilizarlo >>> file = "/usr/bin/firefox" # La ruta que les mencionaba >>> os.path.basename(file) # La función que hará todo el trabajo con la ruta como argumento 'firefox' # Acá podemos ver la salida de la funcion >>> Esta función a diferencia de 'split' solo devuelve la base de la ruta que pasemos como parámetro, excluyendo el directorio donde se encuentra siendo un resultado mas conciso. Quizás no haya explicado en profundidad estas dos funciones, pero con lo que sabemos hasta ahora tenemos como para continuar con nuestra miniaplicacion, porque si volvemos para atrás vamos a recordar que toda esta explicación era para responder una de las preguntas que plantee ¿Como saber con que archivo/carpeta debemos trabajar? ahora ya podemos conseguir esto sin nuestra intervención, pero todavía nos falta una parte ¿Como saber si el primer carácter es un punto?, pero antes de seguir quizás algunos de ustedes se pregunten para que plantearnos esto, pues la respuesta es muy simple porque tenemos que pensar que sentido tiene ocultar un archivo oculto agregando mas de un punto al inicio de su nombre, así que ahora que ya entendimos el porque volvamos con lo que estábamos. Para detectar si el primer carácter es un punto simplemente aplicando (lo que ya deberían de conocer sino es así a volver a estudiar ) las operaciones básicas sobre cadenas vamos a ver que esto es extremadamente simple, lo que deseamos hacer es ver si el archivo con el que estamos trabajando esta ya oculto para esto como mencione anteriormente debemos ver si el primer carácter es un punto, para esto debemos recordar las operaciones sobre cadenas y que para ver un carácter especifico de una cadenas la operación es la misma que para ver un valor de una tupla o una lista, veamoslo con ejemplos: La palabra que analizaremos sera "GNU/Linux" que la asignaremos a la variable "palabra" dijo: >>> palabra = "GNU/Linux" Supongamos que queremos ver el primer carácter de nuestra cadenas, para esto debemos recordar que el indice comienza con 0 y no con 1 dijo: >>> palabra[0] 'G' >>> Como vemos ya estamos listos para seguir con nuestro objetivo principal, pero antes con todo lo que ya vimos podemos empezar a construir nuestra miniaplicacion pero recordemos los tres argumentos principales de nuestro script planteados al inicio del tutorial: dijo:1 - Entra como parámetro un archivo 2 - Si ya esta oculto no se realizaría ninguna acción 3 - Si no esta oculto colocamos como primer carácter en el nombre un punto Con lo visto ya podemos armar los dos primeros, primero armemos la primer parte en donde habíamos visto esto: dijo: archivo = "/usr/bin/firefox" def checkfile(archivo): import os.path if os.path.exists(archivo): print "El fichero existe" else: print "El fichero no existe" Para esto debemos eliminar el código que no nos sirve como las sentencias 'print' y el 'else' del condicional pero vamos de a poco, primero saquemoslo de la función para poder incluirlo en nuestra futura aplicación dijo: import os.path if os.path.exists(archivo): print "El fichero existe" else: print "El fichero no existe" Si nos ponemos a pensar (se que es difícil pero hay que intentarlo) solo con el 'if' podemos satisfacer nuestras necesidades porque nosotros solo necesitamos que la función se detenga si no se encuentra el archivo, por esto mismo si utilizamos 'not' un operador lógico que niega lo que le pongamos después de el estamos cumpliendo con todo lo que necesitamos, volvamos con los ejemplos: dijo:if not os.path.exists(archivo): return Vamos a traducir esto, el 'if' se traduce como 'si' y el 'not' como 'no', con un ingles básico es fácil traducirlo, una traduccion seria si no existe el archivo terminar la ejecución de nuestra aplicación, como vimos esta forma es mucho mas sencilla y es la que vamos a utilizar. Habiendo pulido la primera parte vamos con la segunda, para mostrarles como era que íbamos a comprobar si el archivo ya se encontraba oculto les puse un ejemplo pero ahora es hora de plantearlo para nuestra necesidad, lo tenemos que hacer es ver si el primer carácter de nuestro archivo es un punto y por supuesto como obtener el nombre de nuestro archivo y enviarlo a una variable: dijo: if archivo[0] == '.': return La sentencia 'return' esta porque no necesitamos realizar ninguna acción si el archivo ya esta oculto, pero acá nos esta faltando algo, como obtener el nombre del archivo que nosotros acabamos de analizar. Si volvemos para atrás vamos a recordar que les mostré dos funciones incluidas en el modulo 'os', una era 'split' y la otra 'basename' la que pienso utilizar es la ultima mencionada de las dos, para usarla es tan simple como crear una variable a la que le asignamos la salida de la función 'basename' quedando así: dijo: archivo = os.path.basename(file) Habiendo terminado esto podríamos crear una función llamada 'hide' que tome como argumento un archivo y en ella agregaremos lo que tenemos hasta ahora: dijo: def hide(file): import os if not os.path.exists(file): return archivo = os.path.basename(file) if archivo[0] == '.': return Hasta ahora solo podemos analizar si el archivo esta oculto o no, pero nos falta darle la facultad a esta función de poder ocultar archivos de ser necesario, con esto anuncio que estamos listos para pasar al tercer y ultimo punto del día de hoy: 3 - Si no esta oculto colocamos como primer carácter en el nombre un punto Antes de comenzar déjenme recordarles algo muy básico pero a su ves muy importante en este caso sobre como vamos a tratar a la cadena que contendrá el nombre del archivo, las cadenas a diferencias de por ejemplo las listas son inmutables, con esto dejamos en claro que no vamos a poder cambiar la cadena existente, nuestra solución a esto es crear una nueva cadena en la cual pongamos como primer carácter un punto. Para conseguir que la nueva cadena tenga ese tan preciado punto debemos remontarnos a algo muy básico en las operaciones sobre cadenas y es la concatenación, como lo veremos a continuación conseguir esa nueva cadena es muy simple: dijo: nuevoarchivo = '.' + archivo Veamoslo en acción: dijo: >>> nuevoarchivo = '.' + archivo # Como verán aquí estamos uniendo el punto con el nombre del archivo >>> nuevoarchivo # Llamamos a nuestra nueva cadena '.firefox' # y vemos como logramos colocar ese punto delante del nombre >>> Como vemos funciona y estamos listos para ocultar nuestros archivos con Python, este maravilloso lenguaje nos trae dentro del modulo 'os' una función llamada 'rename' que hará el proceso de renombrar el archivo que deseamos. La función 'rename' esta disponible tanto para sistemas Windows como para sistemas Unix lo que lo vuelve multiplataforma y nos asegura que no vamos a tener inconvenientes en usarlo en nuestra aplicacion, volviendo a su aplicacion esta funcion toma dos argumentos para su funcionamiento, que como se imaginaran uno es el archivo de origen y el otro es el de destino, esto quiere decir que por un lado le indicamos el archivo que deseamos renombrar y por el otro el nuevo archivo que deseamos crear, en nuestro caso queremos pasar del archivo 'firefox' al archivo '.firefox'. Viendo esto en lo llevamos en nuestra aplicacion sabemos que el archivo de origen es el que asignamos a la variable 'file'; una aclaracion que debo hacer con respecto de 'rename' es que debemos usar no el nombre del archivo sino que el archivo junto con la ruta del mismo es por esto que debemos usar la variable 'file' que tiene la ruta completa del archivo, una solucion a esto es cambiar la carpeta con la que trabaja nuestro interprete de Python, para que quede un poco mas claro esto voy dejar de lado nuestro script para dejar un poco mas en claro lo que les acabo de mencionar. La funcion 'rename' como les mencionaba le debemos indicar la ruta completa del archivo tanto para la entrada como para la salida, en caso de que no le demos la ruta completa en la salida de 'rename' movera nuestro archivo a la carpeta donde este trabajando nuestro interprete, para averiguar cual es la carpeta con la que estamos trabajando debemos en nuestro interprete de Python escribir esto: dijo: import os # Deberemos importar el modulo 'os' para que funcione os.getcwd() # Esta es la funcion que nos entregara la carpeta que estamos buscando En mi caso la salida es esta: dijo: >>> import os >>> os.getcwd() '/home/alejandro' >>> Como se imaginaran en caso de no dar la ruta completa en la salida de la funcion 'rename' me moveria el archivo a esa carpeta, viendo este inconveniente como un imprevisto de los cuales hay muchisimos a la hora de trabajar debemos analizar cuales son las posibles soluciones a esto, como ya voy extendiendome demasiado con un script tan simple y los veo impacientes de tanto leer les voy a mostrar tres formas de darle una solucion a esto. La primera que se nos puede ocurrir es reveer lo que hicimos hasta ahora y volver a la parte cuando les mencione la funcion 'split' la cual nos dividia la ruta que le dabamos en dos partes una con la carpeta que contenia al archivo y el nombre del archivo, si obtamos por esto deberiamos descartar el uso de 'basename' para obtener el nombre del archivo cosa que en nuestro caso seria simplemente modificar unas lineas porque tenemos la suerte de estar trabajando con un script de muy pocas lineas y que no es muy complejo asi que no deberiamos tener inconvenientes en usar 'split' en lugar de 'basename'. Pero antes de ponernos a modificar todo lo que ya hicimos y que hasta ahora funciona, veamos que otras soluciones tenemos disponibles. Otra solucion es cambiar la carpeta donde esta trabajando nuestro interpre por la ruta del archivo que deseamos cambiar el nombre, en este punto nos surge un inconveniente el cual es que no tenemos la carpeta que contiene al archivo asi que debemos plantearnos una forma de obtener esa carpeta y asignarla a una variable para su posterior uso en nuestro script, tenemos como mencionaba antes el uso de 'split' para conseguir esto pero si revisamos bien en la documentacion de Python nos vamos a encontrar con 'dirname' que hace casi lo mismo que 'split', lo que hace 'dirname' es entregarnos lo mismo que nos da el primer valor de la tupla de 'split', asi que hasta ahora tenemos dos formas una es usar desde un inicio 'split' y la otra es utilizar 'dirname' junto con 'basename' y tendriamos los mismos resultados. Como la desicion este tutorial no es democratica voy a optar por usar 'dirname', pero antes veamos esto accion para ver si realmente funciona: dijo: >>> import os # Importamos el modulo 'os' >>> file = "/usr/bin/firefox" # Esta va a ser la ruta a analizar >>> os.path.dirname(file) # Usamos la funcion '/usr/bin' # y vemos que funciona de maravilla >>> Ahora si podemos reclinar nuestra silla como señal de satisfaccion por haber solucionado nuestro problema mas "complejo" a lo largo del tutorial, pero tampoco hay que festejar antes de terminar lo que empezamos asi que no sean perezosos y continuemos, si mal no recuerdo nunca habiamos tenido el placer de ver en accion a la funcion 'rename' la habia mencionada pero nunca la testeamos. Para probar esta funcion cree un archivo llamado 'Codigo-Python' el cual esta ubicado en la carpeta donde trabaja mi interprete, vayamos a teclear un poco: dijo: >>> import os # Como de costumbre importamos el modulo 'os' >>> os.rename('Codigo-Python', '.Codigo-Python') # Como veran esta el archivo de origen y el de destino Si volvemos a ver en esa carpeta no deberia ser visible nuestro archivo, salvo que por ejemplo si estamos usando 'Nautilus' presionemos CTRL + H deberian de aparecer los archivos ocultos entre los cuales deberia estar el nuestro y asi corroborar que esta funcion cumple con nuestra necesidad, ahora si juntemos lo que vimos: dijo: directorio = os.path.dirname(file) # Creamos una variable con la ruta nuevoarchivo = directorio + '/''.' + archivo # Ya explico el porque de la contecatenacion aplicada os.rename(file, nuevoarchivo) # y por ultimo llamamos a la funcion 'rename' La primer linea asi como la tercera no es necesaria explicarla pero en la segunda nos encontramos con un cambio con respecto a lo que ya les habia mostrado, porque volviendo para atras yo les habia mostrado lo siguiente: dijo: nuevoarchivo = '.' + archivo Si lo comparamos obviamente vemos la inclusion de la variable 'directorio' que contiene la ruta hacia el archivo a renombrar, pero aparece esta variable concatenada con el siguente caracter '/' esto se debe a que como ya habiamos como funcionaba la funcion 'dirname' y si lo observan bien no coloca la barra al final de la direccion la cual es necesaria para poder utilizarla en nuestro script, al realizar estas dos concatenaciones estas teniendo por un lado la ruta con la barra diagonal al final '/usr/bin/' y por otro lado el nombre con un punto adelante '.firefox' y con esto tendremos listo nuestro script solo es cuestion de armar lo que ya hicimos quedando algo asi: dijo: def hide(file): import os if not os.path.exists(file): return archive = os.path.basename(file) if archive[0] == '.': return 1 else: directorio = os.path.dirname(file) newfile = directorio+'/''.'+archive os.rename(file, newfile) Como finalización de esta primera parte espero haber planteado la base de como encarar (de una forma un tanto desprolija lo admito) el inicio de un proyecto personal con Python y empezar a desarrollar nuestras primeras aplicaciones con este lenguaje, seguramente habre repetido algunos procedimientos o explicaciones pero la razon de esto es poder ofrecer una guia paso a paso apta para los que recien comienzan con la programacion (me incluyo en esto ultimo). Sin mas que decir por el día de hoy me despido y nos veremos en la segunda parte de este tutorial en donde a diferencia de esta primera parte donde nos concentramos por ocultar los archivos, ampliaremos su capacidad dándole la posibilidad de mostrar archivos ocultos, pero eso lo veremos en la segunda parte. Unos links que les pueden ser utiles Sobre 'rename': http://docs.python.org/library/os.html#os.rename Sobre 'split', 'basename' y 'dirname' http://docs.python.org/library/os.path.html#os.path.split http://docs.python.org/library/os.path.html#os.path.basename http://docs.python.org/library/os.path.html#os.path.dirname Un articulo sobre Linux y los archivos ocultos: http://huevas.wordpress.com/2007/08/19/archivos-ocultos-en-linux/ Segui este post tambien en: http://snipplr.com/view/50039/hiding-files-in-gnulinux/ Si ves que este post merece alguna modificacion sentite libre de hacerlo a traves de esta Wiki siguiendo el siguiente enlace: http://wiki.codigopython.com.ar/pyhide:ocultando-archivos-en-gnu-linux Fuente: http://www.codigopython.com.ar/?p=152
Nace un nuevo IDE para Python Seguramente a muchos les ha pasado o están en la situación de no encontrar un buen IDE para Python, si están en esa situación o les gusta probar nuevas herramientas les presento a continuación un editor muy completo y con mucho futuro por delante. En este articulo intentare mostrarles algunas de las virtudes con que cuenta NINJA-IDE el IDE que les mencionare y tratare en este post. Primero porque se llama Ninja, el nombre es bastante interesante ya que son las siglas de "Ninja Is Not Just Another IDE" lo que podríamos traducirlo como "Ninja no es sólo otro IDE" un nombre bastante peculiar y que también lo refleja una vez que lo iniciamos, ya que una vez iniciado disponemos de una interfaz muy agradable y limpia con una barra lateral no superior como otros editores con los botones que mas utilizaremos, donde contamos con por ejemplo los infaltables botones de Nuevo, Abrir Y guardar y sus equivalentes para iniciar, abrir y guardar proyectos; por otro lado junto con lo que les acabo de mencionar en esa barra contamos con una opción que no se encuentra en muchos IDE's que es la ejecutar lo que estemos escribiendo en el interprete de Python lo que nos permite ejecutar todo el proyecto o solo en el archivo con el que estemos trabajando. Cabe destacarse que este IDE esta escrito en Python para Python, no solo se trata de un editor con resaltado de sintaxis para Python sino que nos ofrece funciones similares a las que encontraríamos en PyScripter pero multiplataforma y escrito en Python lo que nos sirve si deseamos colaborar en el desarrollo o aumentar su capacidad a través del uso de plugins que soporta esta aplicación, demás esta destacar que para el apartado gráfico usaron PyQt lo cual lo vuelve muy lindo y agradable a la vista, no por esto estoy menospreciando a PyGtk y WxPython que espero que no se ofendan xd. Este proyecto esta Realizado por miembros de PyAr y otros Colaboradores, y va en aumento debido al gran futuro que esta prometiendo. Algunas características hasta el momento son: dijo: * Resaltado de sintaxis para: Python... * Marca las tabulaciones con pequeños puntos * Incluye una consola de Python * Permite abrir una carpeta, y la explora recursivamente para mostrar luego toda la estructura de la carpeta junto con los archivos Python, HTML, PNG Y JPG incluidos (una especie de detección automática de lo que podría ser un proyecto Python) * Funcionalidades de Abrir, Guardar y Guardar Como soportadas. * Nos muestra cuando un archivo ha sido modificado y también nos advierte al cerrarlo * Indentación automática * F4: Oculta la consola * F11: Oculta todo excepto el editor * Permite visualizar las imágenes del proyecto dentro del mismo IDE abriendo una pestaña nueva * Cierre automático de los símbolos: ', ", {, [ y ( * Y algunos más... Algunas capturas para verlo en funcionamiento en GNU/Linux, Mac y en Windows Un vídeo: link: http://www.youtube.com/watch?v=8qYecJ1ygTc Requisitos: dijo: Python 2.5 en adelante PyQt 4.6 en adelante Y obviamente los requisitos que tengan Python y PyQt Como les había dicho mas arriba es multiplataforma con lo podremos disfrutarlo tanto en GNU/Linux, Windows y Mac y no requiere de instalación con lo cual lo vuelve una opción mas que accesible para todos. Para cerrar NINJA-IDE es una plataforma integrada de desarrollo, especialmente diseñada para construir aplicaciones en Python que aun esta en una etapa muy temprana de su desarrollo pero por lo que me ha demostrado hasta ahora me termino de convencer para convertirlo en mi editor por defecto a la hora de jugar con Python, de mas esta decir que se trata de una aplicación gratuita y es software libre, cuya licencia en la GNU/GPL v3 y podemos participar de su desarrollo aquí http://groups.google.com/group/ninja-ide-dev Mas información: Sitio Web: http://ninja-ide.appspot.com/ Descargar la ultima versión: http://ninja-ide.googlecode.com/files/ninja-ide.zip Notas de la publicación: http://code.google.com/p/ninja-ide/wiki/ReleaseNotes Mas capturas de pantalla: http://code.google.com/p/ninja-ide/wiki/Screenshots Twitter: http://twitter.com/ninja_ide Participa en su desarrollo: http://groups.google.com/group/ninja-ide-dev Fuente: http://www.codigopython.com.ar/herramientas/nace-un-nuevo-ide-para-python

Aceptando parámetros desde la linea de comandos con Python Parte 1 - Parte 2 - Parte 3 Bienvenidos a la ya 4ª parte de esta serie de tutoriales, les recuerdo que en los tres anteriores tutoriales creamos tres funciones, las cuales nos permitían ocultar y desolcultar archivos además de una tercera que nos permitía obtener el estado en que se encontraba dicho archivo. En esta oportunidad les mostrare usando a PyHide (Pueden encontrar mas información sobre este proyecto aquí http://wiki.codigopython.com.ar/pyhide) como interactuar con el usuario a través de la linea de comandos aceptando el uso de argumentos, un ejemplo de esto es el uso del comando 'cd' (este comando nos permite cambiar el directorio de trabajo que estamos utilizando) en Linux este acepta un argumento que es el directorio con el que deseamos trabajar, algo similar deberemos de implementar en nuestra aplicación para facilitar su uso pero para esto planteemos cuales serán lo pasos que tendremos que tener en cuenta para conseguirlo 1 - El usuario ejecuta nuestra aplicación con un argumento 2 - Se analizan los argumentos ingresados 3 - Se ejecuta la función 'hide', 'show' o 'check' según corresponda Eso es una breve descripción de la meta que nos proponemos a lo largo del tutorial, ahora si empecemos por el principio de esto. El primer inciso que nos planteamos implica que nuestra aplicación soporte el uso de argumentos para funcionar, en un principio nuestras funciones ya toman un argumento que es el archivo que se utilizara pero nuestra aplicación va a necesitar dos argumentos uno para indicar el archivo y el otro para indicar la acción ha realizar, es decir si se llama a 'hide' o a 'show', pero veamoslo con un ejemplo. Supongamos que ejecutamos a nuestra aplicación, en este caso llamada PyHide, la ejecutamos con dos argumentos uno es el archivo y el otro la acción, siendo: -c = Para utilizar a 'check' -s = Para utilizar a 'show' -h = Para utilizar a 'hide' file = El archivo a utilizar Un ejemplo seria: python pyhide file -c # Dándole un archivo para analizar quedaría python pyhide /usr/bin/firefox -c Con lo cual estamos ejecutando nuestra aplicación a través de la linea de comandos para ejecutar la función 'check' sobre el archivo '/usr/bin/firefox', como nos damos cuenta ya dimos un paso viendo los argumentos que usara nuestra aplicación y como se usaran por parte del usuario pero falta empezar con lo mas importante que es empezar a escribir las lineas de código necesarias para que esto que planteamos se haga una realidad y como se imaginaran ya deberemos meternos en una previa de lo que sera la segunda parte. Empecemos presentado a una función muy útil cortesía del modulo 'sys' llamada 'argv', esta función va a ser el motor que hará funcionar esto. Esta función 'argv' tiene una forma muy simple de trabajar ya que este se encarga de almacenar los parámetros introducidos desde la linea de comandos en una lista a la que podemos acceder escribiendo "sys.argv[]" ingresando desde luego el índice entre los corchetes '[]', una de las cosas que hay que tener en cuenta es el orden en que se almacenan los parámetros. El primer valor que almacena es el nombre del archivo, el segundo es el primer parámetro y el tercero el segundo parámetro, así como se imaginaran para el resto de los parámetros en caso de que existan. Veamoslo con un ejemplo antes de continuar Un ejemplo seria python pyhide.py file1 file2 file3 action Donde: sys.argv[0] = pyhide.py sys.argv[1] = file1 sys.argv[2] = file2 sys.argv[3] = file3 sys.argv[4] = action Para ver como funciona lo que les mostré arriba es tan simple como crear un archivo (Con o sin la extensión .py) y dentro de este colocamos algo similar a esto: import sys for elements in sys.argv: print elements Y a este archivo desde nuestra consola (Recuerden de estar trabajando en la misma carpeta donde se encuentra este archivo) lo ejecutaremos de la siguiente forma: python archivo.py 1 2 3 Y el resultado sera este: $ python archivo.py 1 2 3 archivo.py 1 2 3 Lo que conseguimos es imprimir todas la variables almacenadas en la lista 'sys.argv', ahora puede surgir una duda sobre ese pequeño script que usamos para mostrar los parámetros ingresados desde la consola, que aunque este lejos de ser el motivo del tutorial no esta de mas explicar su funcionamiento de forma breve. Bueno comienzo a explicar el porque y como del uso del siguiente script: import sys for elements in sys.argv: print elements En la primer linea se importa el modulo 'sys' que es necesario para poder usar la función de este llamada 'argv', ya en la tercera nos encontramos con el bucle 'for' en esta el cuerpo del bucle se ejecuta tantas veces como elementos tenga la lista en este caso se ejecutaría 4 veces el cuerpo de nuestro bucle, es decir se ejecuta cuatro veces la sentencia 'print', mostrando así los cuatro argumentos almacenados en 'sys.argv'. Para mas información pueden consultar en algún libro o tutorial de Python donde podrán encontrar mas información sobre el bucle 'for'. Hasta ahora tenemos una idea de como funciona 'argv' y como almacenar estos valores en variables para su posterior uso, pero nos esta faltando un paso importante saber si el usuario esta ejecutando nuestra aplicación desde la linea de comandos o lo esta importando desde otra aplicación. NOTA: La diferencia entre ejecutar una aplicación (o script) o importarlo radica en que al importarlo su forma de uso se asemeja a como usamos los módulos de Python porque lo que hacemos es utilizar funciones contenidas dentro de este y la interacción con el usuario lo hace la aplicación que importa a la nuestra, en cambio cuando el usuario ejecuta nuestra aplicación directamente necesitamos establecer una forma de comunicación e interacción con el usuario para su uso (Aunque esto no es siempre necesario cuando se tratan de scripts). En esta oportunidad trabajaremos con la consola aunque mas adelante lo veremos ya con una interfaz gráfica pero sera material para otro tutorial. Para identificar si nuestra aplicación esta siendo ejecutada desde la consola tenemos que conocer y entender a el modulo '__main__', esto es porque este nos permitirá dividir la parte que analiza si se esta ejecutando nuestra aplicación directamente de el resto del código que tenemos. Con '__main__' comenzamos ya nuestra segunda parte, no vamos ver muy a fondo tanto a 'sys.argv' como a '__main__' porque mas adelante veremos a estos dos de nuevo pero de una forma mas avanzada en otro tutorial. Cuando se habla de '__main__' y 'sys.argv' se tiende a hablar del siguiente condicional: if __name__ == "__main__": Como vemos entran en juego dos factores uno es '__main__' y el otro es '__name__', toda la explicación que les pueda dar sobre estos dos se resume a lo siguiente: Si '__name__' toma el valor '__main__' nuestra aplicación se esta ejecutando como un programa independiente y no es importada por otra, en cambio si nuestra aplicación es importada '__name__' tomara el nombre del archivo (Sin su extensión) o mejor dicho el nombre del modulo. RECUERDEN: Recordemos que los módulos cuando se importan no llevan la extensión '.py' solo el nombre del archivo. Por ejemplo si abrimos la consola de Python y escribimos "__name__" nos responderá lo siguiente: >>> __name__ '__main__' >>> Esto es porque estamos ejecutando directamente desde la consola, pero para saber si esto no se repite cuando uno importa nuestra aplicación (o script dependerá de con que trabajemos) no nos quedara mas que demostrarlo, acá la cosa se complica por que deberemos crear dos archivos uno que importe un archivo y otro que sea importado. En este caso voy a crear dos archivos uno que se llame 'linux.py' que va a ser el archivo que importe el modulo y el otro sera 'rule.py' Dentro de linux.py pondremos lo básico que sera importar el archivo 'rule.py' linux.py import rule Dentro de rule.py imprimiremos la salida de '__name__' para ver que resultado nos arroja. rule.py print __name__ Una vez creados los dos archivos y ubicados en la misma carpeta (Esto ultimo es muy importante para que funcione) ejecutaremos el archivo 'linux.py' en nuestra consola: $ python linux.py rule Como observamos la salida es lo que habíamos anticipado el nombre del archivo, pero como se que son desconfiados quizás se pregunten si ejecutamos directamente el archivo 'rule.py' se nos da que '__name__' es igual a '__main__', hacerlo es tan simple como escribir en la consola 'rule.py' (Recuerden estar ubicados en la misma directorio donde se encuentran ubicados los dos archivos) La salida sera la siguiente: $ python rule.py __main__ Con lo que corroboramos de que nos les había mentido Ya vimos a 'sys.argv' y a '__main__' es hora de unirlos y ponerlos a prueba en PyHide, así que lo mejor sera poner lo que ya tenemos hasta ahora: import os def hide(file): if not os.path.exists(file): return archive = os.path.basename(file) directorio = os.path.dirname(file) if archive[0] == '.': return else: newfile = directorio+'/''.'+archive os.rename(file, newfile) def show(file): if not os.path.exists(file): return archive = os.path.basename(file) directorio = os.path.dirname(file) if archive[0] != '.': return else: while archive[0] is '.': archive = archive[1:] newfile = directorio+'/'+archive os.rename(file, newfile) def check(file): if not os.path.exists(file): return "El archivo no existe" archive = os.path.basename(file) if archive[0] == '.': return archive + " Se encuentra oculto" else: return archive + " No se encuentra oculto" Para dotarlo de la capacidad de poder utilizar argumentos desde la linea de comando deberemos agregar un par de lineas, una de estas sera obviamente donde importemos al modulo 'sys' las otras serán las que analicen los argumentos ingresados. Cuando llegamos a este punto debemos considerar que el usuario no ingrese parámetros o que no ingrese comandos validos, por esto mismo debemos cubrir esas posibilidades planteando los posibles problemas y soluciones. Empecemos con una pequeña lista como esta: dijo: El usuario no ingresa argumentos El usuario no ingresa la cantidad necesaria de argumentos Los argumentos ingresados no son validos Empecemos desde el principio, sabemos que la cantidad mínima de valores que contiene la lista generada por 'sys.argv' es de 1 valor el cual es el nombre del archivo, así que la longitud de 'argv' debe mayor a uno, pero si vemos el siguiente punto de nuestra lista tenemos que tener cuenta que nuestra aplicación requiere de dos argumentos como mínimo y máximo los cuales eran el nombre del archivo y la acción a realizar, de esta forma al replantearlo vemos que la cantidad de valores que tiene que tener 'sys.argv' debe ser igual a tres. Para analizar la longitud de 'sys.argv' tenemos que considerar el uso de 'len()', así como se suele utilizar para analizar cadenas de texto se puede utilizar para analizar listas y tuplas entre otros. En nuestro caso tenemos que crear un condicional que analice esta condición de la siguiente forma: if len(sys.argv) != 3: return else: pass Quedemos con eso por un momento antes de seguir, primero analizamos si la cantidad de argumentos es la correcta en caso de no serlo como vemos terminamos la ejecución del mismo, si la cantidad de argumentos es la indicada continuamos con el condicional ejecutando lo que coloquemos debajo del 'else' en el caso de que lo necesitamos, en nuestro caso prescindiremos de su uso, una vez superado esto comencemos a analizar el tercer valor que tomara 'sys.argv' que sera la acción a realizar por nuestra aplicación. Recordemos los tres valores que podía tomar dijo: -c = Para utilizar a 'check' -s = Para utilizar a 'show' -h = Para utilizar a 'hide' Como observamos dependerá del argumento ingresado para determinar que función se deberá de llamar, lo primero que podemos hacer es tomar los dos valores que nos interesan y asignarlos a dos variables para facilitar su uso. dijo: file = sys.argv[1] action = sys.argv[2] El valor de 'file' no lo analizaremos eso lo hará la función que sea llamada luego, lo que si tenemos que analizar es el valor de 'action' y dependiendo de el valor que tome actuar en consecuencia, para esto con unos condicionales nos bastara para que quede de la siguiente forma: if action == '-c': check(file) elif action == '-h': hide(file) elif action == '-s': show(file) else: return Como observamos de una forma mas que simple analizamos las cuatro posibilidades que se nos puede presentar, la ultima de estas que esta comprendida por el condicional 'else' esta para actuar en caso de que el usuario haya ingresado un valor incorrecto. NOTA: En los casos que use la sentencia return se pueden reemplazar por mensajes de error indicándole al usuario que fue lo que sucedió pero eso sera material para otro tutorial. Hasta ahora tenemos partes que satisfacen nuestras necesidades pero nos queda juntar todo esto dentro del condicional dijo: if __name__ == '__main__': Para que solo se ejecute cuando el usuario este ejecutando nuestra aplicación desde la consola, así que es cuestión de juntar las partes para formar un todo. if __name__ == '__main__': if len(sys.argv) != 3: print "La cantidad de argumentos ingresada no es correcta" file = sys.argv[1] action = sys.argv[2] if action == '-c': print check(file) elif action == '-h': hide(file) print "El archivo se encuentra oculto" elif action == '-s': show(file) print "El archivo ya no se encuentra oculto" else: print "El argumento ingresado no es correcto" Aunque funciona es una forma un tanto desprolija e incompleta de conseguir esto pero por ahora nos alcanza para dotar a nuestra aplicación de soporte para poder utilizarla desde la linea de comandos. Para probar lo que hicimos hasta ahora es tan simple como juntar todo esto en un archivo al que en mi caso llamare 'PyHide.py' y lo ejecutare con los siguientes valores: dijo: python PyHide.py /usr/bin/firefox -c Y deberíamos obtener algo similar a esto: dijo: $ python PyHide.py /usr/bin/firefox -c firefox No se encuentra oculto Cerrando el tutorial de hoy les dejo el contenido del archivo PyHide.py con su respectiva licencia #!/usr/bin/env python # -*- coding: utf-8 -*- # <Aplicación para ocultar archivos en sistemas Unix.> # Copyright (C) 2011 Alejandro Alvarez <[email protected]> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # http://www.codigopython.com.ar <[email protected]> import os, sys def hide(file): if not os.path.exists(file): return archive = os.path.basename(file) directorio = os.path.dirname(file) if archive[0] == '.': return else: newfile = directorio+'/''.'+archive os.rename(file, newfile) def show(file): if not os.path.exists(file): return archive = os.path.basename(file) directorio = os.path.dirname(file) if archive[0] != '.': return else: while archive[0] == '.': archive = archive[1:] newfile = directorio+'/'+archive os.rename(file, newfile) def check(file): if not os.path.exists(file): return "El archivo no existe" archive = os.path.basename(file) if archive[0] == '.': return archive + " Se encuentra oculto" else: return archive + " No se encuentra oculto" if __name__ == '__main__': if len(sys.argv) != 3: print "La cantidad de argumentos ingresada no es correcta" file = sys.argv[1] action = sys.argv[2] if action == '-c': print check(file) elif action == '-h': hide(file) print "El archivo se encuentra oculto" elif action == '-s': show(file) print "El archivo ya no se encuentra oculto" else: print "El argumento ingresado no es correcto" NOTA: El condicional "if __name__ =='__main__':" deberá ir debajo de las funciones/variable que desee o necesite llamar, esto es así porque no podemos ejecutar una función o leer una variable que el interprete aun no ejecuto. Como conclusión y para cerrar este tutorial podemos decir que junto a 'sys.argv' y el uso de "if __name__ == "__main__"" se puede trabajar como módulos reutilizables o como programas independientes sin tener que crear dos archivos con lo cual estamos ampliando las posibilidades del uso y mantenimiento de nuestra aplicación. Glosario: != : Distinto de Unos links que les pueden ser útiles Acerca de PyHide: http://wiki.codigopython.com.ar/pyhide __main__: http://docs.python.org/library/__main__.html sys.argv: http://docs.python.org/library/sys.html#sys.argv Bucle 'for': http://es.wikipedia.org/wiki/Python#Bucle_for http://www.mclibre.org/consultar/python/lecciones/le05_for.html Acerca del comando 'cd': http://manpages.ubuntu.com/manpages/natty/en/man1/cd.1posix.html Material de lectura recomendada: http://www.holamundo.es/lenguaje/python/articulos/acceder-argumentos-pasados-parámetro-python.html http://mundogeek.net/archivos/2008/04/02/python-entrada-salida-ficheros/ http://foro.elhacker.net/scripting/python_que_es_name_main-t264304.0.html#ixzz1KOZgDEYm Segui este post tambien en: http://snipplr.com/view/55160/ Si ves que este post merece alguna modificacion sentite libre de hacerlo a traves de esta Wiki siguiendo el siguiente enlace: http://wiki.codigopython.com.ar/pyhide:aceptando-parametros-desde-la-linea-de-comandos Fuente: http://www.codigopython.com.ar/?p=203
Tres formas de comprobar la existencia de un archivo En esta oportunidad intentare (espero lograrlo) mostrarles tres formas básicas para comprobar la existencia de un archivo, dos de ellas usa el modulo os y la otra usando la función open, aclaro que son formas básicas con las cuales podemos experimentar y jugar un poco pero no son las únicas formas de hacerlos o la forma mas correcta de usarlos, esa parte se las dejare como tarea. Por cuestiones de no extender demasiado la lectura (me preocupo por ustedes y no los hago leer demasiado xd) voy obviar la explicación de porque nos seria útil saber si un archivo existe o no y vamos a pasar directo a mostrar las tres formas en su funcionamiento y aplicación, vamos a divertirnos un rato con Python. 1º Forma: archivo = "/usr/bin/firefox" def checkfile(archivo): import os.path if os.path.exists(archivo): print "El fichero existe" else: print "El fichero no existe" Como verán a fines prácticos mientras construimos la función agregue una variable con el archivo a detectar que lo usare en las tres formas, en el nombre de la función recuerden que podemos usar cualquier palabra mientras no usemos ninguna de las palabras reservadas por Python las cuales las podemos encontrar aquí o no sea un nombre legal en Python [ Ver mas aquí ], el argumento que toma la función es simplemente el archivo a verificar, siguiendo tenemos lo mas importante que sin esta linea el resto no puede funcionar, se trata de importar el modulo os.path y usar la función exists para comprobar la existencia del archivo, si el archivo existe la función devuelve True en caso contrario devuelve False y gracias a if podemos analizar dicha salida. El inconveniente de esta forma es que no distingue entre un fichero o una carpeta, por ejemplo si cambiáramos nuestra primer linea por: archivo = "/usr/bin/" Seguiría devolviendo True o verdadero, Pasemos a la segunda forma. 2º Forma: def checkfile2(archivo): import os.path if os.path.isfile(archivo): print "El fichero existe" else: print "El fichero no existe" En este caso omití la variable "archivo" por lo que les mencione anteriormente (seguimos usando la misma), esta función es muy similar a la anterior, se diferencia de usar la función 'isfile' de os.path lo nos permite saber si se trata de un archivo o no supliendo con el inconveniente con que contábamos con la forma nº 1, si se trata de un archivo nos devolverá True en caso contrario devolverá False, podemos comprobarlo cambiando el valor de la variable 'archivo' por la ruta de un directorio. También podemos saber si se trata de un directorio cambiando la función 'isfile' por 'isdir' quedando así: directorio = "/usr/bin/" def checkfile2(directorio): import os.path if os.path.isdir(directorio): print "El directorio existe" else: print "El directorio no existe" Esta forma es muy similar si se trata de un directorio devuelve True y si no lo es devuelve False, ahora pasemos a la tercer y ultima forma del día de hoy. 3º Forma: def checkfile3(archivo): try: fichero = open(archivo) fichero.close() print "El fichero existe" except: print "El fichero no existe" Esta tercer y ultima forma utiliza las excepciones de Python para intentar abrir el archivo, si el archivo existe se cierra y se muestra en pantalla el texto que colocamos en la sentencia print y si dicho archivo no existe se produce un error y se ejecutara el código que hayamos colocado en except. Eso fue todo por hoy si les quedo alguna duda pregunten, nos estaremos viendo a la vuelta de cualquier otro tutorial. Mas información sobre el modulo os.path: Mas información sobre os.path.exists: Mas información sobre os.path.isfile Mas información sobre os.path.isdir Esto les va a ser de mucha ayuda para entender el uso excepciones y gestión de ficheros: Podes seguirlo también acá: http://snipplr.com/view/45002/three-ways-to-test-the-existence-of-a-file http://codigo_python.codepad.org/UO9d7D3f