为什么os.path.dirname(__file__)在Django中有效?

5 投票
1 回答
8108 浏览
提问于 2025-04-18 16:04

请解释一下为什么在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$

我发现realpathabspath都能正常工作,但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__))

撰写回答