¿Cómo se determina correctamente el directorio de script actual? [duplicar]

Resuelto bogdan asked hace 14 años • 0 respuestas

Me gustaría ver cuál es la mejor manera de determinar el directorio de script actual en Python.

Descubrí que, debido a las muchas formas de llamar al código Python, es difícil encontrar una buena solución.

Aquí hay algunos problemas:

  • __file__no está definido si el script se ejecuta con exec,execfile
  • __module__está definido sólo en módulos

Casos de uso:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py')(de otro script, que puede estar ubicado en otro directorio y que puede tener otro directorio actual.

Sé que no existe una solución perfecta, pero busco el mejor enfoque que resuelva la mayoría de los casos.

El enfoque más utilizado es os.path.dirname(os.path.abspath(__file__)), pero esto realmente no funciona si ejecuta el script desde otro con exec().

Advertencia

Cualquier solución que utilice el directorio actual fallará; esto puede ser diferente según la forma en que se llama el script o se puede cambiar dentro del script en ejecución.

bogdan avatar Sep 15 '10 21:09 bogdan
Aceptado
os.path.dirname(os.path.abspath(__file__))

es de hecho lo mejor que obtendrás.

Es inusual ejecutar un script con exec/ execfile; normalmente debería utilizar la infraestructura del módulo para cargar scripts. Si debe utilizar estos métodos, le sugiero configurar __file__el globalsque pasa al script para que pueda leer ese nombre de archivo.

No hay otra forma de obtener el nombre del archivo en código ejecutado: como notará, el CWD puede estar en un lugar completamente diferente.

bobince avatar Sep 15 '2010 15:09 bobince

Si realmente desea cubrir el caso en el que se llama a un script a través de execfile(...), puede usar el inspectmódulo para deducir el nombre del archivo (incluida la ruta). Hasta donde yo sé, esto funcionará para todos los casos que enumeró:

filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
Sven Marnach avatar Jun 02 '2011 02:06 Sven Marnach

En Python 3.4+ puedes usar el pathlibmódulo más simple:

from inspect import currentframe, getframeinfo
from pathlib import Path

filename = getframeinfo(currentframe()).filename
parent = Path(filename).resolve().parent

También puedes usar __file__(cuando esté disponible) para evitar el inspectmódulo por completo:

from pathlib import Path
parent = Path(__file__).resolve().parent
Eugene Yarmash avatar May 25 '2017 19:05 Eugene Yarmash