Почему переменная python __file__ возвращает ошибочный путь при использовании в DJango? - PullRequest
1 голос
/ 19 января 2011


Я пытался получить путь к файлу, используя переменную 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 голосов
/ 19 января 2011

Насколько я вижу, C:\Django_example\MySample\webserver.py и C:\Django_example\MySample\..\MySample\webserver.py указывают на один и тот же файл, поэтому он не ошибочен.

Если вы хотите более краткое представление пути, попробуйте:

import os
print "File Path: ", os.path.realpath(__file__)

update (попытка понять вывод __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'

Поскольку абсолютный путь формируется путем добавления относительного пути к базовому пути, я подозреваю, что где-то в вашем пути к питону может быть /../.

Что делатьвы получаете, когда вы печатаете sys.path с вашей точки зрения?

0 голосов
/ 19 января 2011

Чтобы получить текущий путь к каталогу, вы можете сделать что-то вроде этого.

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

Это вернет нормализованную абсолютную версию пути (абсолютный путь), а также нормализует путь. Например, в системах Unix и Mac OS X путь / var / www / project будет работать нормально, но в системах Windows этот путь не подходит. Нормализация пути преобразует прямые косые черты в обратные. Нормализация также разрушает избыточные разделители, например, путь A / foo /../ B будет нормализован к A / B.

Rupesh

...