为什么os.path.dirname(__file__)在Django中有效?
请解释一下为什么在Django中,os.path.dirname(__file__)
可以正常工作,而在普通的Python脚本中却不行?这让我感到很困惑。
我写了一个Python脚本,并把它放在了一个叫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
当我运行这个脚本时,我得到了以下结果:
(env)user@ubuntubox:~/srv/django_pro$ python test_file.py
/home/srv/django_pro
/home/srv/django_pro
(env)user@ubuntubox:~/srv/django_pro$
我发现realpath和abspath都能正常工作,但dirname的结果是空的。不过在Django的settings.py文件中,我有:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
如果我进入Python的命令行,打印出BASE_DIR,它并不是空的:
(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
>>>
这意味着os.path.dirname(os.path.dirname(file))的结果也不是空的。我在这两种情况下使用的是同一个Python版本。而我的Django版本是:
Django==1.7b4
那么,这其中有什么窍门呢?
1 个回答
9
你第一次运行的 脚本 中,__file__
的值是你传给 Python 的 路径。比如你用 python test_file.py
启动这个脚本,那么 __file__
就会被设置为 'test_file.py'
。如果你用 python /home/srv/django_pro/test_file.py
启动,那么你的测试脚本就会显示出完整的路径。
而导入的模块,它们的 __file__
值会被设置为 完整路径。
所以你需要考虑到这一点,并且 始终 使用 os.path.abspath
:
directory = os.path.dirname(os.path.abspath(__file__))