为啥 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 而不是自动选择最后一个兼容版本?这不是
pip
s 能力的一部分吗?
有没有办法制作一个requirements.txt
,在从python2运行时安装Django<2.0
,在使用python3运行时安装Django>=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 下可用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥无法收到电子邮件(python、gmail、django)?
为啥我的来自 Django 的 JSON 在大约 2.1MB 处被截断?
为啥我在 Django 的 Python shell 中出现编程错误?