【问题标题】:Why does python __file__ variable returns errorneous path when used in DJango?为什么在 DJango 中使用 python __file__ 变量返回错误路径?
【发布时间】:2011-01-19 09:37:43
【问题描述】:


我试图在 django 下使用 python __file__ 变量检索文件路径,尽管我得到了正确的路径。它的行为有点奇怪。这是我附加的示例代码,请告诉我为什么会这样。

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。有人可以指出我正确的方向。

提前致谢,
鲁佩什

【问题讨论】:

  • 顺便说一句,你使用的是哪个版本的 django?
  • 我终于设法重现了您的输出。查看更新的答案。

标签: python django django-views


【解决方案1】:

据我所见,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 时,您会得到什么?

【讨论】:

  • 虽然它指向同一个文件,但 file 不应该像这样工作。我的意思是根据 python 文档,它应该返回文件的绝对路径。如果你能更新我的信息,那你真的很棒。
  • @Rupesh:这是一个绝对路径。 “绝对”仅表示它从根开始(在您的情况下为“C:”)。这并不意味着它是最短的路径。
  • @Sander:你是绝对正确的桑德,但我的观点是为什么 file 变量返回路径为 C:\Django_example\MySample\..\MySample\webserver.py 而它应该返回 C:\Django_example\MySample\webserver.py。如果您尝试在简单的 python 脚本而不是 django 应用程序中执行此操作,它会返回相同的结果。
  • 正如@sander 提到的,返回的实际上是一个绝对路径——无论您的工作目录如何,它总是指向同一个文件。至于为什么会有一个多余的path\..\path 条目,我的猜测是归结为模块加载器如何解析路径。也许它将根路径 (C:C:\Django_example\MySample) 与相对路径 (..\MySample\webserver.py) 连接起来以获得绝对路径。
  • 我认为 os.path 上有一个 realpath 方法这一事实表明这并非完全出乎意料的行为。
【解决方案2】:

要获取当前目录路径,您可以执行以下操作。

    import os  
    os.path.abspath(os.path.dirname(__file__))

这将返回路径名(绝对路径)的规范化绝对版本,并将规范化路径。例如,在 Unix 和 Mac OS X 系统上,路径 /var/www/project 可以正常工作,但在 Windows 系统上,这不是一个好的路径。规范化路径会将正斜杠转换为反斜杠。规范化还会折叠多余的分隔符,例如路径 A/foo/../B 将被规范化为 A/B。

鲁佩什

【讨论】:

  • 您缺少右括号。另外,您能否详细说明这与您的问题有何关系?你解决了你的问题吗?这将帮助其他人提供更合适的反馈/解决方案。
  • 感谢您发现这个错误。这不是我问题的确切答案。这只是解决问题的一种方法,或者您可以通过使用它来解决问题,您将获得确切的路径。为什么会这样,仍然是个问题。
  • 感谢您的澄清。我也很好奇,但我似乎无法复制这种行为(因此上面 cmets 中关于 django 版本的问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
相关资源
最近更新 更多