2009-02-27 34 views
248

Duplicate:
In Python, how do I get the path and name of the file that is currently executing?¿Cómo obtengo la ruta de un script de Python en el que me estoy ejecutando?

¿Cómo obtengo la ruta de acceso del script de Python en el que me estoy ejecutando? Estaba haciendo dirname(sys.argv[0]), sin embargo, en Mac solo obtengo el nombre de archivo, no la ruta completa, como lo hago en Windows.

No importa desde dónde se inicia mi aplicación, quiero abrir archivos que son relativos a mi archivo (s) de scripts.

+14

Parece que Jeff olvidó que no todos los scripts de Python son módulos, nomine para la reapertura. – sorin

+0

@sorin oh, pero lo son; un objeto 'module' se puede crear para cualquier archivo de script. El hecho de que algo nunca se 'importe' en realidad no lo convierte en "no es un módulo". La respuesta es la misma, de todos modos: trate el guión como un módulo (use algún tipo de arranque si es realmente necesario) y luego aplique la misma técnica. –

+6

Sí, un script es un módulo, pero esta pregunta bien hecha debe ser reabierta. No se ha respondido aquí, y la pregunta "duplicada" no es un duplicado porque solo responde cómo obtener la ubicación de un módulo que ha cargado, no el que está. –

Respuesta

48
import os 
print os.path.abspath(__file__) 
+0

Gracias. Esta es la ruta del archivo .py donde está escrito el código, que es lo que quiero, aunque OP quería otra ruta. – OdraEncoded

71

7.2 de Dive Into Python: Finding the Path.

import sys, os 

print('sys.argv[0] =', sys.argv[0])    
pathname = os.path.dirname(sys.argv[0])   
print('path =', pathname) 
print('full path =', os.path.abspath(pathname)) 
+1

Me gusta cómo tu respuesta muestra muchas variaciones y características de pitón para resolver la pregunta. –

+0

Sí, y me gusta más porque no usa las variables '__' (sé que es solo una convención para los nombres de sistema) – Davide

+65

Esto ** no funciona ** si llama al script a través de otro script desde otro directorio. – sorin

-3

Si usted tiene incluso el nombre de ruta relativa (en este caso parece ser ./) puede abrir los archivos relativos a su archivo (s) secuencia de comandos. Yo uso Perl, pero se puede aplicar la misma solución general: dividí el directorio en una matriz de carpetas, luego pop del último elemento (el script), luego push (o para usted, append) en lo que quisiera, y luego me uní ¡Juntos de nuevo, y BAM! Tengo un nombre de ruta de trabajo que apunta exactamente donde espero apuntar, relativo o absoluto.

Por supuesto, hay mejores soluciones, según lo publicado. Me gusta el mío.

+3

En python, esto no funciona si llama al script desde una ruta completamente diferente, p. si estás en '~' y tu script está en '/ some-path/script' obtendrás'./'igual a' ~ 'y no a'/some-path' como lo pidió (y yo también) – Davide

+2

pregunta fue cómo obtener la ruta del módulo, no cómo construir una ruta de acceso de otra –

+0

¡Mire ahora, Chris! ¡Mírate ahora! – zelusp

321

os.path.realpath(__file__) le dará la ruta del archivo actual, resolviendo cualquier enlace simbólico en la ruta. Esto funciona bien en mi mac.

+9

No estoy tan seguro de eso, aquí un resultado de OSX 10.6 'NameError: nombre global '__file__' no está definido' – sorin

+9

Sorin: ¿Quizás probé la expresión en el intérprete de comandos? –

+3

Obtengo lo mismo y lo uso en un programa que no está en el shell. Archivo "C: \ Python27 \ pydocs \ cli_mate new \ chimpbot.py", línea 15, en __init__ self.current_dict = os.path.realpath (__ archivo __) + '\ data \ default_dict.dat' NameError: nombre global '__file__' no está definido –

31

La solución aceptada para esto no funcionará si planea compilar sus scripts utilizando py2exe. Si usted está pensando en hacerlo, esto es el equivalente funcional:

os.path.dirname(sys.argv[0]) 

py2exe no proporciona una variable __file__. Para referencia: http://www.py2exe.org/index.cgi/Py2exeEnvironment

+2

Desafortunadamente, esto no funciona en Mac, como dice el OP. Por favor, consulte [sys.argv] (http://docs.python.org/library/sys.html#sys.argv): _es dependiente del sistema operativo si este es un nombre de ruta completo o no_ – Stefano

+0

(es increíblemente complejo obtener un realmente la solución entre navegadores ...) – Stefano

+6

@Stefano ** eso no es un problema **. Para asegurarse de que sea una ruta de acceso absoluta (completa), use 'os.path.abspath (...)' –

Cuestiones relacionadas