¿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
¿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
__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'
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). –
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 ...) –
@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__' ... –
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
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
@FogleBird: ¿Qué hay de malo en evitar '__file__' por completo y seguir esto: http://www.py2exe.org/index.cgi/WhereAmI ?? –
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
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)
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])
Pero podría estar ejecutando el script desde otro directorio, y argv [0] devolvería el script camino, no tuyo – ramosg
@willehr: La ruta del script es EXACTAMENTE lo que requiere el OP. –
@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"? –
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
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.
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 –