为啥 django 2 在 python 2 下可用?

Posted

技术标签:

【中文标题】为啥 django 2 在 python 2 下可用?【英文标题】:Why is django 2 available under python 2?为什么 django 2 在 python 2 下可用? 【发布时间】:2018-05-18 08:13:53 【问题描述】:

根据Django 2.0 release notes Django 2.0 以后将只支持 python 3,使得 1.11.X 成为支持 python 2 的最后一个版本系列。

请参阅发行说明页面中的引用:

Django 2.0 支持 Python 3.4、3.5 和 3.6。我们强烈推荐并仅正式支持每个系列的最新版本。

Django 1.11.x 系列是最后一个支持 Python 2.7 的。

但是,在运行 pip2 install Django 时,正在安装 django 版本 2(然后失败,因为它假定功能在 python 2 中不可用):

(venv-crap) mbp15:server nir$ pip2 install django
Collecting django
  Downloading Django-2.0.tar.gz (8.0MB)
    100% |████████████████████████████████| 8.0MB 177kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/PATH/django/setup.py", line 32, in <module>
        version = __import__('django').get_version()
      File "django/__init__.py", line 1, in <module>
        from django.utils.version import get_version
      File "django/utils/version.py", line 61, in <module>
        @functools.lru_cache()
    AttributeError: 'module' object has no attribute 'lru_cache'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/PATH/django/

我知道我可以手动指定低于 2 的要求版本,使 pip 安装一个对 python 2 有效的版本,但是如果我想同时支持 python2 和 python3,这将使安装过程复杂化,并且假设 pip 会知道安装仅与运行它的 python 兼容的版本。

因此,我的问题如下:

    为什么 pip 尝试使用 python2 安装 Django2 而不是自动选择最后一个兼容版本?这不是pips 能力的一部分吗? 有没有办法制作一个requirements.txt,在从python2运行时安装Django&lt;2.0,在使用python3运行时安装Django&gt;=2.0

【问题讨论】:

第一个问题请见ticket 28878 【参考方案1】:

为什么 pip 尝试使用 python2 安装 Django2 而不是自动选择最后一个兼容版本?这不是点子功能的一部分吗?

正如Alasdair 已经在 cmets 中指出的那样,这是 Django 中的一个已知错误:bug #28878。

有没有办法制作一个单独的 requirements.txt,当从 python2 运行时将安装 Django=2.0?

您可以使用环境标记(参见PEP 508):

# requirements.txt
django>=1.11,<2.0; python_version<"3.4"
django>=2.0; python_version>="3.4"

这将安装一个并跳过另一个 django 依赖项,具体取决于您使用的 python:

$ pip2.7 install -r requirements.txt 
Ignoring django: markers 'python_version >= "3.4"' don't match your environment
Collecting django<2.0 (from -r requirements.txt (line 1))
  Downloading Django-1.11.8-py2.py3-none-any.whl (6.9MB)
...

$ pip3.6 install -r requirements.txt 
Ignoring django: markers 'python_version < "3.4"' don't match your environment
Collecting django>=2.0 (from -r requirements.txt (line 2))
  Using cached Django-2.0-py3-none-any.whl
...

【讨论】:

以上是关于为啥 django 2 在 python 2 下可用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 给我一个 404 错误

为啥无法收到电子邮件(python、gmail、django)?

为啥我的来自 Django 的 JSON 在大约 2.1MB 处被截断?

为啥我在 Django 的 Python shell 中出现编程错误?

如何将python code 打包成linux系统下可执行?

django,python为啥本地化后时间戳会发生变化