/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?

3
Vaibhav Bajpai 12 jul. 2011 a las 20:12

6 respuestas

La mejor respuesta

Prueba esto:

import os.path
p = os.path.abspath(__file__)
7
Manny D 12 jul. 2011 a las 16:20
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.

0
Droj 13 jul. 2011 a las 02:34

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.

0
wberry 12 jul. 2011 a las 16:19

La variable __file__ contendrá la ubicación del archivo Python individual.

2
g.d.d.c 12 jul. 2011 a las 16:14

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].

0
ulidtko 12 jul. 2011 a las 16:45

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')
2
dwerner 12 jul. 2011 a las 16:19