根据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
能力的一部分吗?requirements.txt
运行时创建一个Django<2.0
安装Django>=2.0
?答案 0 :(得分:3)
为什么pip试图用python2安装Django2而不是自动选择最后一个兼容版本?不是pips功能的一部分吗?
正如Alasdair已经在评论中指出的那样,这是Django中的已知错误:bug #28878。
有没有办法制作单个requirements.txt,在运行python3时从python2和Django&gt; = 2.0运行时会安装Django&lt; 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
...