Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why os.path.dirname(__file__) is working in Django? [duplicate]

Please explain why os.path.dirname(__file__) is working in Django, but not working in python? This is kind of weird situation which I can't understand.

I made a python script and put it in a file test_file.py:

import os

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

print dirname
print realpath
print abspath

When I run the script, I get results:

(env)user@ubuntubox:~/srv/django_pro$ python test_file.py 

/home/srv/django_pro
/home/srv/django_pro
(env)user@ubuntubox:~/srv/django_pro$

I get results that realpath and abspath are working, but dirname is empty. However in Django settings.py I have:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

If I go into python shell and print out BASE_DIR, it is not empty:

(env)user@ubuntubox:~/srv/django_pro$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
>>> 
>>> print 'BASE_DIR:\n%s' % settings.BASE_DIR
BASE_DIR:
/home/srv/django_pro
>>> 

And that means os.path.dirname(os.path.dirname(file)) is not empty. I am using same python in both cases. And my Django version is:

Django==1.7b4

So what is the trick?

like image 315
baltasvejas Avatar asked Aug 05 '14 12:08

baltasvejas


1 Answers

The first script that you run has __file__ set to the path you passed to Python. You started the script with python test_file.py so __file__ is set to 'test_file.py'. Had you used python /home/srv/django_pro/test_file.py your test script would have shown a path for all three options.

Imported modules, on the other hand, have their __file__ value set to the full path.

You need to take this into account and always use os.path.abspath:

directory = os.path.dirname(os.path.abspath(__file__))
like image 60
Martijn Pieters Avatar answered Nov 14 '22 22:11

Martijn Pieters