python - lenguaje - Encuentre la ruta al archivo que se está ejecutando actualmente
python tutorial (6)
El archivo en ejecución siempre es __file__
.
Aquí hay 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
¿Cómo puedo encontrar la ruta completa al script en ejecución de Python? Es decir, ¿qué tengo que poner para lograr esto?
Nirvana@bahamut:/tmp$ python baz.py
running from /tmp
file is baz.py
El nombre del script será (¿siempre?) El primer índice de sys.argv:
import sys
print sys.argv[0]
Una forma aún más fácil de encontrar la ruta de su script en ejecución:
os.path.basename(sys.argv[0])
Esto imprimirá el directorio en el que vive el script (a diferencia del directorio de trabajo):
import os
dirname, filename = os.path.split(os.path.abspath(__file__))
print "running from", dirname
print "file is", filename
Así es como se comporta, cuando lo puse 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
Yo sugeriría
import os, sys
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0]
De esta forma, puede crear de forma segura enlaces simbólicos al script ejecutable y aún encontrará el directorio correcto.
__file__
NO es lo que estás buscando. No use efectos secundarios accidentales
sys.argv[0]
es siempre la ruta de acceso al script (si en realidad se ha invocado un script) - consulte http://docs.python.org/library/sys.html#sys.argv
__file__
es la ruta del archivo actualmente en ejecución (script o módulo). ¡Esto es accidentalmente el mismo 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, entonces 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''
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
Compruebe os.getcwd () ( docs )