为什么在Django中使用python的__file__变量会返回错误路径?

1 投票
2 回答
2935 浏览
提问于 2025-04-16 10:14


我在用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.pyC:\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

撰写回答