Intentaré abordar algunas variaciones sobre esta pregunta también:
- encontrar la ruta del guión llamado
- encontrar la ruta del script que se está ejecutando actualmente
- encontrar el directorio del script llamado
(Algunas de estas preguntas se han formulado en SO, pero se han cerrado como duplicados y se han redirigido aquí).
Advertencias de uso __file__
Para un módulo que haya importado:
import something
something.__file__
devolverá la ruta absoluta del módulo. Sin embargo, dado el siguiente script foo.py:
#foo.py
print '__file__', __file__
Llamarlo con 'python foo.py' devolverá simplemente 'foo.py'. Si agrega un shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
y llamarlo usando ./foo.py, devolverá './foo.py'. Llamarlo desde un directorio diferente (por ejemplo, poner foo.py en la barra de directorio), luego llamar
python bar/foo.py
o agregando un shebang y ejecutando el archivo directamente:
bar/foo.py
devolverá 'bar / foo.py' (la ruta relativa ).
Encontrar el directorio
Ahora, ir desde allí para obtener el directorio, os.path.dirname(__file__)
también puede ser complicado. Al menos en mi sistema, devuelve una cadena vacía si la llama desde el mismo directorio que el archivo. ex.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
dará salida:
__file__ is: foo.py
os.path.dirname(__file__) is:
En otras palabras, devuelve una cadena vacía, por lo que esto no parece confiable si desea usarlo para el archivo actual (a diferencia del archivo de un módulo importado). Para evitar esto, puede envolverlo en una llamada a abspath:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
que produce algo como:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Tenga en cuenta que abspath () NO resuelve enlaces simbólicos. Si desea hacer esto, use realpath () en su lugar. Por ejemplo, hacer un enlace simbólico file_import_testing_link apuntando a file_import_testing.py, con el siguiente contenido:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
la ejecución imprimirá rutas absolutas como:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Usar inspeccionar
@SummerBreeze menciona el uso del módulo de inspección .
Esto parece funcionar bien, y es bastante conciso, para módulos importados:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
obedientemente devuelve el camino absoluto. Sin embargo, para encontrar la ruta del script que se está ejecutando actualmente, no vi una manera de usarlo.