为什么在Django中使用python的__file__变量会返回错误路径?
我在用Python的 __file__
变量获取Django中的文件路径时,虽然得到了正确的路径,但它的表现有点奇怪。这里是我附上的示例代码,请告诉我为什么会这样。
from django.shortcuts import render_to_response
import datetime
class WebServer():
def __init__(self):
pass
def display_first_page(self, request):
print "File Path: ", __file__
return render_to_response('Hello')
我把这段代码存放在这个位置:C:\Django_example\MySample。理想情况下,它应该返回类似 C:\Django_example\MySample\webserver.py 的路径,但我得到的是 C:\Django_example\MySample\..\MySample\webserver.py。有人能帮我指明正确的方向吗?
提前谢谢你,
Rupesh
2 个回答
6
从我所看到的情况来看,C:\Django_example\MySample\webserver.py
和 C:\Django_example\MySample\..\MySample\webserver.py
指向的是同一个文件,所以这并没有错误。
如果你想让路径看起来更简洁,可以试试:
import os
print "File Path: ", os.path.realpath(__file__)
更新(尝试理解 __file__
的输出)
我能重现这种行为的唯一方法是更新 sys.path
。举个例子:
[me@home]$ cd /project/django/xyz
[me@home]$ ./manage.py shell
(InteractiveConsole)
>>> from app import models as M
>>> M.__file__
'/project/django/xyz/app/models.pyc'
>>> import sys
>>> sys.path.append('../')
>>> from xyz.app import models as N
>>> N.__file__
'/project/django/xyz/../xyz/app/models.pyc'
因为绝对路径是通过将相对路径加到基础路径上形成的,所以我怀疑你的 Python 路径中可能有 /../
的部分。
当你在视图中打印 sys.path
时,结果是什么?
0
要获取当前目录的路径,你可以这样做。
import os
os.path.abspath(os.path.dirname(__file__))
这段代码会返回一个标准化的绝对路径,也就是完整的路径。举个例子,在Unix和Mac OS X系统上,路径 /var/www/project 是可以正常工作的,但在Windows系统上,这个路径就不太合适了。标准化路径的过程会把正斜杠(/)转换成反斜杠(\)。此外,标准化还会简化多余的分隔符,比如路径 A/foo/../B 会被简化成 A/B。
Rupesh