Как узнать версии Python, Django и путь, по которому работает сайт Django? - PullRequest
1 голос
/ 21 сентября 2010

В настоящее время у меня есть несколько сайтов Django, запущенных с одного сервера Apache через WSGI, и каждый сайт имеет свой собственный virtualenv с, возможно, небольшим различием версий Python и Django. Для каждого сайта я хочу показать версию Python и Django, которую он использует, а также путь, по которому он извлекает двоичные файлы Python.

Для каждого сайта Django я могу сделать:

import sys
sys.version

но я не уверен, показывает ли он Python, который использует сайт, или системный Python. Любая помощь по этому поводу?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2010

Чтобы узнать, какой Python используется, запишите значение sys.executable. Он должен содержать путь к используемому интерпретатору.

0 голосов
/ 21 сентября 2010

Это немного больше, чем вы просили, но у нас похожая ситуация, когда разные каталоги (возможно) используют разные коды Python / Django.Мы используем следующее, чтобы создать удобный для просмотра список (по крайней мере для меня) версий Python и Django, а также всех модулей и мест их загрузки.Иногда это помогло спасти то немногое, что осталось от моих волос.Изменить по вкусу.

import sys, re, os
import django

def ModuleList():
    ret = []
    # The double call to dirname() is because this file is in our utils/ 
    # directory, which is one level down from the top of the project.
    dir_project = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
    project_name = os.path.basename(dir_project)

    for k,v in sys.modules.items():

        x = str(v)
        if 'built-in' in x:
            ret.append((k, 'built-in'))
            continue

        m = re.search(r"^.*?'(?P<module>.*?)' from '(?P<file>.*?)'.*$", x)
        if m:
            d = m.groupdict()
            f = d['file']
            # You can skip all of the re.sub()'s if you want raw paths
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/site-packages/django/', 'system django >> ', f)
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/site-packages/', 'site-packages >> ', f)
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/', 'system python >> ', f)
            f = re.sub(dir_project+'.*python/', 'local python >> ', f)
            f = re.sub(dir_project+'.*django/', 'local django >> ', f)
            f = re.sub(dir_project+r'(/\.\./)?', project_name + ' >> ', f)
            ret.append((d['module'], f))
    ret.sort( lambda a,b: cmp(a[0].lower(), b[0].lower()) )
    ret.insert(0, ('Python version', sys.version) )
    ret.insert(0, ('Django version', django.get_version()) )

    return ret
# ModuleList
0 голосов
/ 21 сентября 2010

но я не уверен, показывает ли он Python, который использует сайт, или системный Python. Любая помощь по этому поводу?

Нет.

Однако, если вы хотите что-то узнать о вашем приложении Django, сделайте это.

  1. Использовать ведение журнала. Пишите в sys.stderr, который обычно направляется в errors_log mod_wsgi. Или загляните внутрь запроса на файл wsgi.errors.

  2. Обновите ваш высокоуровневый urls.py, чтобы написать сообщение о запуске, включая sys.version в ваш журнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...