| You are here: Inicio > Inmersión en Python > Programación Funcional > Encontrar la ruta | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
A veces es útil, cuando ejecutamos scripts de Python desde la línea de órdenes, saber dónde está situado en el disco el script que está en marcha.
Éste es uno de esos pequeños trucos que es virtualmente imposible que averigüe por su cuenta, pero que es simple de recordar una vez lo ha visto. La clave es sys.argv. Como vio en Capítulo 9, Procesamiento de XML, almacena una lista de los argumentos de la línea de órdenes. Sin embargo, también contiene el nombre del script que está funcionando, exactamente igual que se le invocó en la línea de órdenes, y es información suficiente para determinar su situación.
Si aún no lo ha hecho, puede descargar éste ejemplo y otros usados en este libro.
import sys, os print 'sys.argv[0] =', sys.argv[0]pathname = os.path.dirname(sys.argv[0])
print 'path =', pathname print 'full path =', os.path.abspath(pathname)
os.path.abspath merece una mejor explicación. Es muy flexible; puede tomar cualquier tipo de ruta.
>>> import os >>> os.getcwd()/home/usted >>> os.path.abspath('')
/home/usted >>> os.path.abspath('.ssh')
/home/usted/.ssh >>> os.path.abspath('/home/usted/.ssh')
/home/usted/.ssh >>> os.path.abspath('.ssh/../foo/')
/home/usted/foo
| No hace falta que existan los nombres de rutas y ficheros que se le pasan a os.path.abspath. | |
| os.path.abspath no se limita a construir nombres completos de rutas, también los normaliza. Eso significa que si está en el directorio /usr/, os.path.abspath('bin/../local/bin') devolverá /usr/local/bin. Normaliza la ruta haciéndola lo más sencilla posible. Si sólo quiere normalizar una ruta así, sin convertirla en completa, use os.path.normpath. | |
[usted@localhost py]$ python /home/usted/diveintopython/common/py/fullpath.pysys.argv[0] = /home/usted/diveintopython/common/py/fullpath.py path = /home/usted/diveintopython/common/py full path = /home/usted/diveintopython/common/py [usted@localhost diveintopython]$ python common/py/fullpath.py
sys.argv[0] = common/py/fullpath.py path = common/py full path = /home/usted/diveintopython/common/py [usted@localhost diveintopython]$ cd common/py [usted@localhost py]$ python fullpath.py
sys.argv[0] = fullpath.py path = full path = /home/usted/diveintopython/common/py
| os.path.abspath es multiplataforma igual que las otras funciones del os módulos os y os.path. Los resultados parecerán ligeramente diferentes que en mis ejemplos si está usted usando Windows (que usa barras invertidas como separador de ruta) o Mac OS (que usa dos puntos - :), pero seguirá funcionando. Ésa es la idea principal del módulo os. | |
Adenda. Un lector no estaba satisfecho con esta solución y quería poder ejecutar todas las pruebas unitarias en el directorio actual, no en aquél donde se encontrase regression.py. Sugirió este enfoque alternativo:
import sys, os, re, unittest def regressionTest(): path = os.getcwd()sys.path.append(path)
files = os.listdir(path)
![]()
Esta técnica le permitirá reutilizar este script regression.py en varios proyectos. Simplemente lo pone en un directorio común, y cambia al directorio del proyecto antes de ejecutarlo. Encontrará y ejecutará todas las pruebas unitarias de ese proyecto en lugar de las que se encuentren en el mismo directorio de regression.py.
<< Programación Funcional |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Revisión del filtrado de listas >> |