如何在运行时检查 Django 中已安装应用程序的版本?

Posted

技术标签:

【中文标题】如何在运行时检查 Django 中已安装应用程序的版本?【英文标题】:How to check the version of a installed application in Django in running time? 【发布时间】:2012-10-20 04:12:51 【问题描述】:

我基本上需要知道它安装和添加到的特定应用程序的版本

INSTALLED_APPS = (
    ...
    'the_application',
    ...
)

我知道我可以使用 pip freeze。我知道当前虚拟环境中的应用程序版本。

问题是我想支持the_application的两个版本。

settings.INSTALLED_APP['the_application'].get_version() 之类的东西就是我要找的东西...

【问题讨论】:

【参考方案1】:

这取决于应用程序如何管理它的版本控制。例如django-tagginghas a tuple VERSION that you can check and a get_version() to return the string 函数。因此,无论您想检查版本(在运行时实时),只需执行以下操作:

import tagging
print tagging.get_version() # or print tagging.VERSION for the tuple

【讨论】:

【参考方案2】:

模块/应用程序通常会通过模块级别的__version__ 属性公开其版本。例如:

import gunicorn
print gunicorn.__version__ # Prints version

import haystack
print haystack.__version__ 

请注意以下几点:

不保证;检查 应用程序公开其版本的“格式”会有所不同。例如,上面的第一个打印在我的测试系统上打印了'0.15.0';第二个在同一系统上打印(2, 0, 0, 'beta')

【讨论】:

另见:***.com/questions/710609/… 和 ***.com/questions/710609/… 多么巧合啊!干草堆正是我的问题!【参考方案3】:

感谢 Ngure Nyaga! 您的回答进一步帮助了我,但它并没有告诉我将 vesrion

放在哪里

但是这个答案并没有告诉我把这个__version__放在哪里

所以我查看了一个打开的应用程序,它确实显示在 django 调试工具栏中。 我查看了 django restframework 代码,发现:

版本放在__init__.py文件中

(见https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/init.py)

它被放在这里:

__version__ = '2.2.7'
VERSION = __version__  # synonym

在此之后,在他的 setup.py 中,他从 __init__.py 获得了这个版本: 见:https://github.com/tomchristie/django-rest-framework/blob/master/setup.py

像这样:

import re

def get_version(package):
    """
    Return package version as listed in `__version__` in `init.py`.
    """
    init_py = open(os.path.join(package, '__init__.py')).read()
    return re.match("__version__ = ['\"]([^'\"]+)['\"]", init_py).group(1)

version = get_version('rest_framework')

使用 buildout 和 zestreleaser 时:

顺便说一句,IAm 使用 buildout 和 zest.releaser 进行构建和版本控制。

在这种情况下,上面有点不同(但基本相同的想法):

见http://zestreleaser.readthedocs.org/en/latest/versions.html#using-the-version-number-in-setup-py-and-as-version

setup.py 中的版本由 setup.py 自动编号,所以在__init__.py 你这样做:

import pkg_resources

__version__ = pkg_resources.get_distribution("fill in yourpackage name").version
VERSION = __version__  # synonym

【讨论】:

以上是关于如何在运行时检查 Django 中已安装应用程序的版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数据库中已有的空表[重复]

在JAVA中已检查异常和位未检查异常是啥?二者有何区别?

IIS中已安装了PHP,可以打开PHP和ASP,为啥

列出频道中已安装的软件包

如何使某个模板仅对 Django 中已确认的用户可见?

Django:如何在启动时禁用数据库状态检查?