/home/bar/foo/test.py:
Estoy intentando test.py
imprimir /home/bar/foo
independientemente de desde dónde ejecuto el script:
import os
def foo():
print os.getcwd()
Prueba de funcionamiento:
[/home/bar $] python /home/bar/foo/test.py # echoes /home/bar
[/tmp $] python /home/bar/foo/test.py # echoes /tmp
os.getcwd()
no es la función para la tarea. ¿Cómo puedo hacer esto de otra manera?
6 respuestas
Prueba esto:
import os.path
p = os.path.abspath(__file__)
import sys
print sys.path[0]
Esto le dará la ruta completa a su script cada vez, mientras que __file__
le dará la ruta que se utilizó para ejecutar el script. 'sys.path'
siempre tiene la ruta al script como primer elemento, lo que permite que uno siempre pueda importar otros archivos .py en el mismo directorio.
Coloque esto en un archivo y luego ejecútelo.
import inspect, os.path
def codepath(function):
path = inspect.getfile(function)
if os.path.isabs(path): return path
else: return os.path.abspath(os.path.join(os.getcwd(), path))
print codepath(codepath)
Mis pruebas muestran que esto imprime la ruta absoluta del script Python si se ejecuta con una ruta absoluta o no. También lo probé con éxito al importarlo desde otra carpeta. El único requisito es que una función o equivalente invocable esté presente en el archivo.
La variable __file__
contendrá la ubicación del archivo Python individual.
Como otros han notado, puede usar el atributo __file__
de los objetos del módulo.
Aunque, me gustaría señalar que, en general, no en Python, podría haber utilizado sys.argv[0]
para el mismo propósito. Es una convención común entre diferentes shells pasar el nombre de ruta absoluto completo del programa a través de argv[0]
.
Si el script está en algún lugar de tu camino, entonces sí, puedes quitarlo de sys.argv
#!/usr/bin/env python
import sys
import os
print sys.argv
print os.path.split(sys.argv[0])
dan@somebox:~$ test.py
['/home/dan/bin/test.py']
('/home/dan/bin', 'test.py')
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.