为什么django 2在python 2下可用?

时间:2017-12-04 19:27:18

标签: python django python-3.x python-2.7 pip

根据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兼容的版本。

因此,我的问题如下:

  1. 为什么pip试图用python2安装Django2而不是自动选择最后一个兼容版本?这不是pip能力的一部分吗?
  2. 当使用python3运行时,有没有办法在从python2和requirements.txt运行时创建一个Django<2.0安装Django>=2.0

1 个答案:

答案 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
...