bal*_*jas 4 python django python-2.7
请解释为什么os.path.dirname(__file__)
在Django中工作,但不在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
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,我得到结果:
(env)user@ubuntubox:~/srv/django_pro$ python test_file.py
/home/srv/django_pro
/home/srv/django_pro
(env)user@ubuntubox:~/srv/django_pro$
Run Code Online (Sandbox Code Playgroud)
我得到了realpath和abspath正在运行的结果,但是dirname是空的.但是在Django settings.py中我有:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)
如果我进入python shell并打印出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
>>>
Run Code Online (Sandbox Code Playgroud)
这意味着os.path.dirname(os.path.dirname(file))不为空.我在两种情况下都使用相同的python.我的Django版本是:
Django==1.7b4
Run Code Online (Sandbox Code Playgroud)
那诀窍是什么?
您运行的第一个脚本已__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__))
Run Code Online (Sandbox Code Playgroud)