2009-08-18 21 views
28

¿Cómo puedo encontrar la ruta completa al script en ejecución de Python? Es decir, ¿qué tengo que poner para lograrlo:Buscar ruta al archivo que se está ejecutando actualmente

[email protected]:/tmp$ python baz.py 
running from /tmp 
file is baz.py 
+0

posible duplicado de [¿Cómo obtener la ruta completa del directorio actual del archivo en Python?] (Http://stackoverflow.com/questions/3430372/how-to-get-full-path-of-current-files-directory -in-python) Esto vino antes, pero eso es más explícito. O bien: http://stackoverflow.com/questions/50499/in-python-how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executin –

Respuesta

50

__file__ no es lo que busca. No utilice accidentales efectos secundarios

sys.argv[0] es siempre la ruta a la secuencia (si, de hecho, un guión ha sido invocada) - ver http://docs.python.org/library/sys.html#sys.argv

__file__ es el camino de la ejecución actualmente archivo (secuencia de comandos o módulo). ¡Esto es accidentalmente igual que el script si se accede desde el script! Si desea poner cosas útiles como ubicar los archivos de recursos relativos a la ubicación del script en una biblioteca, debe usar sys.argv[0].

Ejemplo:

C:\junk\so>type \junk\so\scriptpath\script1.py 
import sys, os 
print "script: sys.argv[0] is", repr(sys.argv[0]) 
print "script: __file__ is", repr(__file__) 
print "script: cwd is", repr(os.getcwd()) 
import whereutils 
whereutils.show_where() 

C:\junk\so>type \python26\lib\site-packages\whereutils.py 
import sys, os 
def show_where(): 
    print "show_where: sys.argv[0] is", repr(sys.argv[0]) 
    print "show_where: __file__ is", repr(__file__) 
    print "show_where: cwd is", repr(os.getcwd()) 

C:\junk\so>\python26\python scriptpath\script1.py 
script: sys.argv[0] is 'scriptpath\\script1.py' 
script: __file__ is 'scriptpath\\script1.py' 
script: cwd is 'C:\\junk\\so' 
show_where: sys.argv[0] is 'scriptpath\\script1.py' 
show_where: __file__ is 'C:\\python26\\lib\\site-packages\\whereutils.pyc' 
show_where: cwd is 'C:\\junk\\so' 
+0

de acuerdo! Lo siento, me costó un tiempo darme la vuelta; Me tomé un descanso del código que usé para lo que necesito esto. Pero después de mucha deliberación, os.getcwd() hizo exactamente lo que necesitaba y no __file__, que en cambio me dio el nombre del archivo en el que estaba la función (no el archivo que se está ejecutando). –

+2

Como nota, si está buscando la ruta al archivo que contiene la línea específica de código que se está ejecutando, '__file__' es el que debe usar. (Por ejemplo, un '__init __. Py' donde no sabe dónde va a vivir y necesita agregar' dirname() 'a' sys.path' cuando se importa ese módulo ...) –

+1

@MarkRibau: Tu primera oración es verdadera pero superfloosa (eso es lo que '__file__' se define como). Su segunda oración no tiene nada que ver con la pregunta, y es extremadamente desconcertante: si no sabe dónde está un módulo, no puede importarlo, y si no puede importarlo no puede obtener su '__file__' ... –

16

Esto imprimirá el directorio en el que vive el guión (en comparación con el directorio de trabajo):

import os 
dirname, filename = os.path.split(os.path.abspath(__file__)) 
print "running from", dirname 
print "file is", filename 

es como Esta se comporta, cuando lo pongo en c:\src:

> cd c:\src 
> python so-where.py 
running from C:\src 
file is so-where.py 

> cd c:\ 
> python src\so-where.py 
running from C:\src 
file is so-where.py 
+0

Tenga en cuenta que esto falla cuando se ejecuta en py2exe, si alguna vez planea usar eso. En ese caso, puede importar un módulo ficticio junto con el módulo principal y obtener su atributo __file__ y seguir el mismo proceso, aunque el módulo estará contenido en a.archivo zip, por lo que tendrá que dividirlo de manera diferente. – FogleBird

+1

@FogleBird: ¿Qué hay de malo en evitar '__file__' por completo y seguir esto: http://www.py2exe.org/index.cgi/WhereAmI ?? –

+0

Bueno, mi manera funciona tanto en py2exe como fuera de ella sin ningún control condicional. Además, los documentos py2exe están muy dispersos y es difícil encontrar lo que estás buscando. – FogleBird

2
import sys, os 

file = sys.argv[0] 
pathname = os.path.dirname(file) 
print 'running from %s' % os.path.abspath(pathname) 
print 'file is %s' % file 

Comprobar os.getcwd() (docs)

2

El nombre de secuencia de comandos (? Siempre) ser el primer índice de sys.argv:

import sys 
print sys.argv[0] 

Una forma aún más fácil encontrar el camino de su script en ejecución:

os.path.basename(sys.argv[0]) 
+0

Pero podría estar ejecutando el script desde otro directorio, y argv [0] devolvería el script camino, no tuyo – ramosg

+1

@willehr: La ruta del script es EXACTAMENTE lo que requiere el OP. –

+1

@Daz: (1) error de sintaxis (2) si la ruta de acceso absoluta al script es, por ejemplo, 'r" C: \ myfiles \ fubar.py "', el nombre base es '" fubar.py "' - ¿eso es lo que usted llama "la ruta de su script de ejecución"? –

1

El rodaje el archivo es siempre __file__.

Aquí es un script de demostración, llamado identify.py

print __file__ 

Aquí están los resultados

MacBook-5:Projects slott$ python StackOverflow/identify.py 
StackOverflow/identify.py 
MacBook-5:Projects slott$ cd StackOverflow/ 
MacBook-5:StackOverflow slott$ python identify.py 
identify.py 
2

Yo sugeriría

import os, sys 
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0] 

De esta manera se pueden crear de forma segura enlaces simbólicos al script ejecutable y que todavía se encuentra el directorio correcto.

Cuestiones relacionadas