2012-06-30 26 views
31

Estoy utilizando el módulo os para tener rutas de acceso relativas en mi proyecto Django settings.py. La variable SITE_ROOT se establece en el directorio de trabajo actual del archivo settings.py y luego se utiliza para hacer referencia a todos los directorios static/media que también se encuentran en ese mismo directorio.os.getcwd() vs os.path.abspath (os.path.dirname (__ file__))

Aquí está mi problema:

print os.getcwd() 
print os.path.abspath(os.path.dirname(__file__)) 

En settings.py, las declaraciones anteriores tienen ambas salidas idénticas. pero mi plantilla sólo se cargará si uso SITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Django busca las plantillas aquí:

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates'), 
) 

SITE_ROOT ajustado a os.getcwd() parece que Django busque la carpeta de plantillas en el directorio anterior del archivo settings.py

No puedo usar os.getcwd() y mi sitio funciona bien, pero tengo curiosidad por saber qué puede estar pasando aquí :)

¿Alguien sabe?

+0

El directorio de trabajo actual y '__file__' no están relacionados. El primero puede cambiar, dependiendo de dónde ejecutas el programa y si usas 'os.chdir' dentro, el otro depende solo de dónde se coloca el módulo en el sistema de archivos. –

Respuesta

32

Como dijo mouad, os.getcwd() no le dará exactamente lo que está esperando.

os.getcwd() hace un poco más que devolver el directorio de trabajo actual. Por defecto es $ PWD en su entorno. No es donde se encuentra el script, sino dónde estaba cuando ejecutó el script.

Estar en /home/user y haciendo python manage.py, os.getcwd() regresará /home/user Estar en /home/ y haciendo python user/manage.py, os.getcwd() volverá /home

pero aún así no habrá siempre es cierto, ya que es posible utilizar os.chdir(). Es en otras palabras como hacer cd. También cambiará el valor de retorno de os.getcwd().

Por otro lado. __file__ es la ruta del archivo del módulo. Por lo tanto, debe usar esto para asegurarse de tener una ruta relativa a su módulo en lugar del directorio de trabajo actual que puede cambiar.

Como dijo ShawnFumo, __file__ puede no ser siempre absoluto. Para obtener una mejor idea de cómo funciona, puede verificar esa respuesta: Python __file__ attribute. Además, a partir de Python3.4 __file__ siempre debe ser una ruta absoluta.

Espero que esté claro.

+0

AH ok, tiene mucho sentido dónde django está buscando la plantilla. THanks – darko

+5

Tenga en cuenta que lo que devuelve '__file__' no siempre es una ruta absoluta, por lo que debe usar' os.path.abspath' para asegurarse. – ShawnFumo

+0

@Loic Faure-Lacroix: Buena explicación ... Gracias u :-) –

0

Si las dos afirmaciones que muestra realmente tienen el mismo resultado, entonces cualquiera de las dos debería funcionar. Entonces, o bien: 1) son sutilmente diferentes, por ejemplo, uno tiene una barra inclinada, el otro no, o 2) está probando en un entorno y ejecutándose en otro.

2

os.getcwd() se no darle la ruta donde se encuentra el settings.py sino que le dará el camino desde donde se ejecuta la secuencia de comandos (en su caso manage.py).

4

El comando os.path.abspath(os.path.dirname(__file__)) devuelve el directorio en el que se almacena el archivo de código, pero os.getcwd() le da su directorio de trabajo actual, que es de forma predeterminada cuando se ejecuta el código, éste se puede cambiar usando el comando os.chdir().

Cuestiones relacionadas