2012-02-14 24 views
56
A = os.path.join(os.path.dirname(__file__), '..') 

B = os.path.dirname(os.path.realpath(__file__)) 

C = os.path.abspath(os.path.dirname(__file__)) 

Normalmente solo conecto estos con la ruta real. Pero hay una razón para estas declaraciones que determinan la ruta en el tiempo de ejecución, y realmente me gustaría entender el módulo os.path para que pueda comenzar a usarlo.¿qué significa la variable __file__?

+5

Obviamente, no es un comodín. – tripleee

+3

Es una variable "mágica"; comodín significa algo completamente diferente. –

Respuesta

66

Cuando se carga un módulo en Python, __file__ se establece con su nombre. A continuación, puede utilizar estos fondos con otras funciones para encontrar el directorio que el archivo se encuentra en

Tomando sus ejemplos uno a la vez:.

A = os.path.join(os.path.dirname(__file__), '..') 
# A is the parent directory of the directory where program resides. 

B = os.path.dirname(os.path.realpath(__file__)) 
# B is the canonicalised (?) directory where the program resides. 

C = os.path.abspath(os.path.dirname(__file__)) 
# C is the absolute path of the directory where the program resides. 

se puede ver los diferentes valores devueltos por estos aquí:

import os 
print __file__ 
print os.path.join(os.path.dirname(__file__), '..') 
print os.path.dirname(os.path.realpath(__file__)) 
print os.path.abspath(os.path.dirname(__file__)) 

y asegúrese de que se ejecuta desde diferentes lugares (como ./text.py, ~/python/text.py y así sucesivamente) para ver lo que hace la diferencia.

+3

Buena respuesta, pero vea otro un detalle importante de otras respuestas: '__file__' NO está definido en todos los casos, p. módulos C vinculados estáticamente. No podemos contar con '__file__' siempre disponible. –

+2

En intérprete, todos los ejemplos devuelven 'name '__file__' no está definido'. – user1063287

+2

@ user1063287 Mire la respuesta de DemoUser; '__file__' es la ruta del archivo desde el que se cargó el módulo, si se cargó desde un archivo. Esto significa que '__file__' solo funcionará cuando lo ejecute como un script no en un intérprete. (A menos que lo importe en intérprete ...) – YOUNG

10

por la documentation:

__file__ es la ruta del archivo desde el que el módulo fue cargado , si se carga desde un archivo. El atributo __file__ no es presente para los módulos C que están vinculados estáticamente en el intérprete; para módulos de extensión cargados dinámicamente desde una biblioteca compartida, es la ruta de acceso del archivo de biblioteca compartida.

y also:

__file__ es ser el “camino” al archivo a menos que el módulo se basa en (y por lo tanto aparece en sys.builtin_module_names), en cuyo caso no se establece el atributo.

8

Usando __file__ combinado con diversos módulos permite os.path todos los caminos sean relativa ubicación del directorio del módulo actual. Esto permite que sus módulos/proyectos sean portátiles a otras máquinas.

En su proyecto lo hace:

A = '/Users/myname/Projects/mydevproject/somefile.txt' 

y luego tratar de implementarlo en el servidor con un directorio despliegues como /home/web/mydevproject/ entonces su código no será capaz de encontrar los caminos correctamente.

30

Solo quiero abordar algo de confusión primero. __file__ no es un comodín, es un atributo. Los atributos y métodos de doble subrayado se consideran "especiales" por convención y tienen un propósito especial.

http://docs.python.org/reference/datamodel.html muestra muchos de los métodos y atributos especiales, si no en todos.

En este caso __file__ es un atributo de un módulo (un objeto de módulo). En Python, un archivo .py es un módulo. Entonces import amodule tendrá un atributo de __file__ que significa cosas diferentes en circunstancias diferentes.

tomadas de los documentos:

__file__ es la ruta del archivo desde el que se carga el módulo, si se carga desde un archivo. El atributo __file__ no está presente en para los módulos C que están vinculados estáticamente en el intérprete; para módulos de extensión cargados dinámicamente desde una biblioteca compartida, es el nombre de ruta del archivo de biblioteca compartida.

En su caso, el módulo está accediendo a su propio atributo __file__ en el espacio de nombres global.

Para ver esto en acción Tratar:

# file: test.py 

print globals() 
print __file__ 

y ejecute:

python test.py 

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': 
'test_print__file__.py', '__doc__': None, '__package__': None} 
test_print__file__.py 
Cuestiones relacionadas