【问题标题】:What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenv 等有什么区别?
【发布时间】:2017-05-25 05:21:42
【问题描述】:

Python 3.3 在其标准库中包含新包venv。它有什么作用,它与似乎与正则表达式 (py)?(v|virtual|pip)?env 匹配的所有其他软件包有何不同?

【问题讨论】:

  • 为了抢占票数,我觉得这是一个比stackoverflow.com/questions/29950300/… 更笼统的问题,所以我不想编辑那个问题或在那个帖子上发布一个过于笼统的答案。
  • 本指南既有用又不断更新,因为 python 继续添加更多和更多“唯一一种明显的方式”来做事:docs.python-guide.org/en/latest/dev/virtualenvs
  • 从 3.6 开始,与 macOS 上的 pyenv 相比,我发现 virtualenv 更容易工作(我是 pyNoob)
  • 我用 pipenv 浪费了一整天的时间。归根结底,它被过度营销了。如果您需要 py2,则 Venv 和 virtualenv 是合适的工具。 Conda(如果您不需要完整堆栈,则为 miniconda)也非常好。非常好的文章:chriswarrick.com/blog/2018/07/17/…
  • 我认为下面接受的答案对 venv 有一些不幸的偏见,这是用于 Python 3 的正确工具。它应该真的排在第一位,其次是 virtualenv . docs.python.org/3/library/venv.html

标签: python virtualenv virtualenvwrapper pyenv python-venv


【解决方案1】:

这是我对初学者的个人建议:首先学习 virtualenvpip,这两个工具可用于 Python 2 和 3 以及各种情况,然后学习其他工具一旦你开始需要它们。

现在回答这个问题:这些同名事物之间有什么区别:venv、virtualenv 等?

PyPI 包不在标准库中:

  • virtualenv 是一种非常流行的工具,可以为 Python 库创建独立的 Python 环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是一个非常有用的工具。

    它的工作原理是在一个目录中安装一堆文件(例如:env/),然后修改PATH 环境变量,为其添加一个自定义的bin 目录前缀(例如:env/bin/)。 pythonpython3 二进制文件的精确副本放置在此目录中,但 Python 被编程为首先在环境目录中查找与其路径相关的库。它不是 Python 标准库的一部分,但得到了 PyPA(Python Packaging Authority)的正式祝福。激活后,您可以使用pip 在虚拟环境中安装包。

  • pyenv 用于隔离 Python 版本。例如,您可能希望针对 Python 2.7、3.6、3.7 和 3.8 测试您的代码,因此您需要一种在它们之间切换的方法。一旦激活,它会在PATH 环境变量前加上~/.pyenv/shims 前缀,其中有与Python 命令匹配的特殊文件(pythonpip)。这些不是 Python 提供的命令的副本;它们是特殊脚本,根据PYENV_VERSION 环境变量、.python-version 文件或~/.pyenv/version 文件动态决定运行哪个版本的 Python。 pyenv 还使下载和安装多个 Python 版本的过程更容易,使用命令 pyenv install

  • pyenv-virtualenvpyenv同一作者的pyenv插件,让您可以方便地同时使用pyenvvirtualenv。但是,如果您使用 Python 3.3 或更高版本,pyenv-virtualenv 将尝试运行python -m venv(如果可用),而不是virtualenv。如果您不想要便利功能,可以同时使用virtualenvpyenv,而不使用pyenv-virtualenv

  • virtualenvwrappervirtualenv 的一组扩展(参见docs)。它为您提供mkvirtualenvlssitepackages 之类的命令,尤其是workon 用于在不同的virtualenv 目录之间切换。如果您需要多个 virtualenv 目录,此工具特别有用。

  • pyenv-virtualenvwrapperpyenvpyenv同一作者的插件,方便将virtualenvwrapper整合到pyenv中。

  • pipenv 旨在将Pipfilepipvirtualenv 组合成一个命令行上的命令。 virtualenv 目录通常放在~/.local/share/virtualenvs/XXX 中,XXX 是项目目录路径的哈希。这与virtualenv 不同,后者的目录通常位于当前工作目录中。 pipenv 用于开发 Python 应用程序(而不是库)。 pipenv 也有替代品,比如poetry,这里就不一一列举了,因为这个问题只针对同名的包。

标准库:

  • pyvenv(不要与上一节中的 pyenv 混淆)是 Python 3 附带的脚本,但 deprecated in Python 3.6 存在问题(更不用说令人困惑的名字了)。在 Python 3.6+ 中,完全等价于 python3 -m venv

  • venv 是 Python 3 附带的一个包,您可以使用 python3 -m venv 运行它(尽管出于某种原因,某些发行版将其分离到一个单独的发行版包中,例如 python3-venv在 Ubuntu/Debian 上)。它的用途与virtualenv 相同,但只有一部分功能(see a comparison here)。 virtualenv 继续比 venv 更受欢迎,特别是因为前者同时支持 Python 2 和 3。

【讨论】:

  • 这很有帮助!那么为什么有 8 个纠结的东西而不是 1 个呢? (“应该有一种——最好只有一种——显而易见的方法。”——Python 之禅)
  • @Jerry101,venv 的引入部分是对这种混乱的回应。如果您想帮助改善这种情况,我建议您使用 venv 并鼓励其他人也这样做。
  • “venv 的引入在一定程度上是对这种混乱的一种回应”为什么当有太多的事情做“类似 X”的事情时,人们总是认为他们可以通过制造另一个来改善这种混乱做'类似于X'的东西。它实际上有点好笑。我们现在是 4 年后......所以可能有必要问一下,venv 真的解决了这个问题吗?
  • 列表中仅有的两个真正涵盖了可以说是相同领域的工具是 virtualenv 和 venv,因此我们正在处理由几个竞争工具造成的混乱的描述不是很精确。但是,该列表确实包含几个与虚拟环境相关的工具,所有工具的名称听起来都相似。这可能会令人困惑,尤其是对于刚刚了解它们的用户而言。 venv 是否改善了这种情况?它确实为其他虚拟环境工具提供了一个更轻量级的替代方案,受益于本机修改和标准库中的一个位置。 …
  • 必填xkcd.com/927
【解决方案2】:

我会避免在 Python3.3+ 之后使用virtualenv,而是使用标准发布的库venv。要创建一个新的虚拟环境,您可以输入:

$ python3 -m venv <MYVENV>  

virtualenv 尝试将 Python 二进制文件复制到虚拟环境的 bin 目录中。但是,它不会更新嵌入到该二进制文件中的库文件链接,因此如果您将 Python 从源代码构建到具有相对路径名的非系统目录中,则 Python 二进制文件会中断。由于这是您制作副本可分发 Python 的方式,因此这是一个很大的缺陷。顺便说一句,要检查 OS X 上的嵌入式库文件链接,请使用 otool。例如,在您的虚拟环境中,输入:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

因此,我会避免使用 virtualenvwrapperpipenvpyvenv 已弃用。 pyenv 似乎经常在使用 virtualenv 的地方使用,但我也会远离它,因为我认为 venv 也可以做 pyenv 的用途。

venv 在 shell 中创建新鲜沙盒的虚拟环境,带有用户可安装的库,它是多python安全

新鲜:因为虚拟环境仅从 python 附带的标准库开始,所以您必须在虚拟环境处于活动状态时使用 pip install 重新安装任何其他库。

沙盒:因为这些新库安装在虚拟环境之外都不可见,因此您可以删除整个环境并重新开始,而不必担心影响您的基础 python 安装。

用户可安装的库:因为在您已经拥有的某个目录中创建的虚拟环境的目标文件夹没有sudo,因此您不需要sudo 权限即可将库安装到其中。

多 python 安全:因为当虚拟环境激活时,shell 只能看到用于构建该虚拟环境的 python 版本(3.4、3.5 等)。

pyenvvenv 相似之处在于它允许您管理多个python 环境。但是使用pyenv,您不能方便地将库安装回滚到某个启动状态,并且您可能在某些时候需要admin 权限来更新库。所以我觉得也最好用venv

在过去的几年里,我在构建系统(emacs 包、python 独立应用程序构建器、安装程序...)中发现了许多问题,最终归结为 virtualenv 的问题。我认为当我们消除这个附加选项并且只使用venv 时,python 将是一个更好的平台。

编辑:BDFL 的推文,

我使用 venv(在标准库中)和一堆 shell 别名来快速切换。

——Guido van Rossum (@gvanrossum) October 22, 2020

【讨论】:

  • 很好的答案@RiazRizvi,它提供了许多与公认答案平行的见解。然而,我认为pyenv 仍然在阳光下占有一席之地,尽管venv 获得了虚拟环境的关注。我现在能想到在我的工作流程中仍然使用pyenv 的经典原因是,AWS Lambda 支持的最高 Python 运行时是 3.8,而 Python 3.9 出来了,我希望其他非 Lambda 项目基于 3.9。所以我仍然需要pyenv 来切换版本。使用pyenv-virtualenv 允许用户同时使用pyenvvenv(不是`virtualenv)。
  • virtualenvwrapper 有什么问题?
  • @riaz rizvi Multi python safe:你如何为不同的python版本创建虚拟环境?我认为它始终默认为用于创建 venv 的 python(系统范围安装)版本
  • somuchtolearnandshare - 显式调用您要使用的 python - $ path/to/python3x -m venv &lt;MYVENVx&gt; $ path/to/python3y -m venv &lt;MYVENVy&gt; 然后当您激活环境时,您将激活用于创建环境的 python
  • @Edison ,我大部分时间都直接使用 conda,除非我很懒(然后我可能会使用 Anaconda Navigator)。如果我通过使用与 conda 安装命令交错的 pip 无意中损坏了 conda 环境,那么我将使用 conda 回滚到较早的 conda 环境修订版(请参阅 conda list --revisions)或在导出环境后使用 conda 删除环境。 yaml 文件。我使用 Spyder、JupyterLab、VSCode 和 PyCharm(按照我工作的简单性而定)。越简单越好。 VSCode + plugins 是一个很好的全功能IDE。
【解决方案3】:

更新 20200825:

添加在“结论”段落下方

我已经进入了pipenv 兔子洞(确实是一个又深又黑的洞......)并且因为最后一个答案是 2 多年前,觉得用我发现的 Python 虚拟信封主题的最新发展来更新讨论很有用。

免责声明:

这个答案不是关于继续关于 pipenv 的优点的激烈辩论strong>venv 作为信封解决方案 - 我不支持任何一个。这是关于 PyPA 认可相互冲突的标准,以及 virtualenv 的未来发展如何承诺否定 或者/或在它们之间进行选择。我专注于这两个工具正是因为它们是 PyPA 指定的工具。

venv

正如 OP 所述,venv 是一种用于虚拟化环境的工具。 不是第三方解决方案,而是原生工具。 PyPA 支持 venv 创建虚拟信封:“Changed in version 3.5: The use of venv is now recommended for creating virtual environments”。

pipenv

pipenv - 与 venv 类似 - 可用于创建虚拟信封,但还可用于包管理和vulnerability checking 功能。 pipenv 不是使用requirements.txt,而是通过Pipfile 提供包管理。作为PyPA endorses pipenv for PACKAGE MANAGEMENT,这似乎意味着pipfile 将取代requirements.txt

但是pipenv 使用 virtualenv 作为创建虚拟信封的工具, NOT venvPyPA 认可为创建虚拟信封。

冲突标准:

因此,如果确定虚拟信封解决方案还不够困难,我们现在有 PyPA 支持两种使用不同虚拟信封解决方案的不同工具。可以在 here 找到关于 venv 与 virtualenv 的激烈 Github 辩论,其中突出了这种冲突。

冲突解决:

上述链接中提到的 Github 辩论已将 virtualenv 的发展导向了在 @ 中容纳 venv 的方向987654326@:

首选内置 venv:如果目标 python 有 venv,我们将创建 使用它的环境(然后对其执行后续操作 以促进我们提供的其他保证)

结论:

因此,这两种竞争的虚拟信封解决方案之间似乎会有一些未来的融合,但截至目前 pipenv - 使用 virtualenv - 与venv.

鉴于 the problems pipenv solves 以及 PyPA 给予了它的祝福,它似乎光明的未来。如果 virtualenv 实现了其提出的开发目标,那么选择虚拟信封解决方案不应再成为 pipenv em> 或 venv

更新 20200825

我在进行此分析时看到的对 Pipenv 的一个经常重复的批评是它没有得到积极的维护。确实,使用一个由于缺乏持续开发而未来可能会受到质疑的解决方案有什么意义呢?在经历了大约 18 个月的枯竭期之后,Pipenv 再次被积极开发。事实上,从那时起,released 就已经有大量的重大更新。

【讨论】:

  • 那么 pyenv 呢?这是一个很好的答案,因为它着眼于未来的方向,但不清楚它如何与 pyenv 或 conda 或其他环境管理器交互
  • 尽可能避免使用所有 pip 虚拟环境。改用 conda。 Conda 提供了一种统一的方法。它由专业的开源开发人员团队维护,并拥有一家信誉良好的公司提供资金和商业支持的版本。相比之下,维护 pip、venv、virtualenv、pipenv 和许多其他 pip 变体的团队资源有限。 pip 虚拟环境的多样性对于初学者来说是令人沮丧的。当 conda 包不存在时,使用 pip 虚拟环境及其(太多)变体作为最后的手段。
【解决方案4】:

让我们从这些工具想要解决的问题开始:

我的系统包管理器没有我想要的 Python 版本,或者我想并排安装多个 Python 版本,Python 3.9.0 和 Python 3.9.1、Python 3.5.3 等

然后使用 pyenv。

我想安装和运行多个具有不同、相互冲突的依赖关系的应用程序。

然后使用 virtualenv 或 venv。它们几乎可以完全互换,不同之处在于 virtualenv 支持较旧的 python 版本并具有一些更小的独特功能,而 venv 在标准库中。

我正在开发一个/application/,需要管理我的依赖,管理我项目的依赖的依赖解析。

然后使用 pipenv 或诗歌。

我正在开发 /library/ 或 /package/ 并希望指定我的库用户需要安装的依赖项

然后使用设置工具。

我使用了 virtualenv,但我不喜欢 virtualenv 文件夹分散在各种项目文件夹中。我想要集中管理环境和一些简单的项目管理

然后使用 virtualenvwrapper。变体:pyenv-virtualenvwrapper 如果你也使用 pyenv。


不推荐

  • pyvenv.这已弃用,请改用 venv 或 virtualenv。不要与 pipenv 或 pyenv 混淆。

【讨论】:

  • 康达怎么样?你会建议完全反对吗?你会使用什么信息来决定 pipenv 和诗歌?
  • pipenv/poetry 使用两个文件工作流来管理依赖项。第一个文件指定逻辑依赖,第二个文件是 pipenv/poetry 自动生成的依赖锁文件。 requirements.txt 是两个文件的混合,比较简单,但是没有单独的锁定文件会降低灵活性,维护依赖列表也更困难。
  • @soMuchToLearnAndShare pipenv 构建在 virtualenv/venv 之上,因此您始终可以一起使用它们。 Pipenv 增加了许多比 virtualenv 更高级别的特性,即依赖管理。 Virtualenv 不管理依赖项,它所做的只是提供隔离环境来安装依赖项。
  • @soMuchToLearnAndShare venv 在标准库中可用,这是对 virtualenv 的主要优势。我不想在 PyPA 口中多说什么,但 virtualenv 确实有一些 venv 没有的额外功能,并且它适用于更大范围的 Python 版本。如果您需要 virtualenv 提供的附加功能而不是 venv,那么您显然应该使用 virtualenv。如果您对当前使用 venv 的设置感到满意,那么没有理由选择 virtualenv。
  • @soMuchToLearnAndShare 但如果您不介意额外安装,也没有理由避免使用 virtualenv。如果你想使用 pipenv,那么它只支持 virtualenv。没有理由仅仅因为它使用 virtualenv 而避免使用 pipenv,尤其是因为使用 pipenv 已经意味着您无论如何都需要额外安装。归根结底,virtualenv 和 venv 创建的环境目录几乎相同,因此您选择的虚拟环境工具主要只在创建环境时很重要,而在使用时则无关紧要。
【解决方案5】:

2020 年 1 月更新

@Flimm 很好地解释了所有差异。通常,我们想知道所有工具之间的区别,因为我们想决定什么最适合我们。那么,下一个问题是:使用哪一个?我建议您选择以下两种官方方式之一来管理虚拟环境:

【讨论】:

    【解决方案6】:
    • pyenv - 管理不同的 python 版本,
    • 所有其他 - 创建虚拟环境(已隔离 python 版本和安装的“要求”),

    pipenv 想要结合所有,除了以前它安装“需求”(进入活动虚拟环境或创建自己的 如果没有激活)

    所以也许你只会对 pipenv 感到满意。

    但我使用:pyenv + pyenv-virtualenvwrapper, + pipenv(pipenv 仅用于安装要求)。

    在 Debian 中:

    1. apt install libffi-dev

    2. 根据https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/安装pyenv,但是..

    3. .. 但不是 pyenv-virtualenv 而是安装 pyenv-virtualenvwrapper(可以是独立库或 pyenv 插件,这里是第二个选项):

      $ pyenv install 3.9.0
      
      $ git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git $(pyenv root)/plugins/pyenv-virtualenvwrapper
      # inside ~/.bashrc add:
      # export $VIRTUALENVWRAPPER_PYTHON="/usr/bin/python3"
      $ source ~/.bashrc
      
      $ pyenv virtualenvwrapper
      

    然后为你的项目创建虚拟环境(workingdir 必须存在):

    pyenv local 3.9.0  # to prevent 'interpreter not found' in mkvirtualenv
    python -m pip install --upgrade pip setuptools wheel
    mkvirtualenv <venvname> -p python3.9 -a <workingdir>
    

    并在项目之间切换:

    workon <venvname>
    python -m pip install --upgrade pip setuptools wheel pipenv
    

    在一个项目中,我有文件 requirements.txt,没有修复里面的版本(如果不需要某些版本限制)。 您有 2 个可能的工具可以将它们安装到当前的虚拟环境中:pip-toolspipenv。假设您将使用 pipenv:

    pipenv install -r requirements.txt
    

    这将创建 Pipfile 和 Pipfile.lock 文件,固定版本在第二个。如果你想重新安装完全相同的版本,那么(Pipfile.lock 必须存在):

    pipenv install
    

    请记住,Pipfile.lock 与某些 Python 版本相关,如果您使用其他版本,则需要重新创建。

    如您所见,我编写了 requirements.txt。这有一些问题:您也必须从 Pipfile 中删除已删除的包。所以直接写Pipfile可能会更好。

    所以你可以看到我使用 pipenv 非常糟糕。也许你用得好,它可以代替一切?

    EDIT 2021.01:我已将堆栈更改为:pyenv + pyenv-virtualenvwrapper + poetry。 IE。我不使用 apt 或 pip 安装 virtualenv 或 virtualenvwrapper,而是安装 pyenv 的插件 pyenv-virtualenvwrapper。这是更简单的方法。

    Poetry 非常适合我:

    poetry add <package>   # install single package
    poetry remove <package>
    poetry install   # if you remove poetry.lock poetry will re-calculate versions
    

    【讨论】:

    • 您能否详细说明您当前的堆栈,我的意思是pyenv + pyenv-virtualenvwrapper + poetry,尤其是您如何指示poetry 使用通过pyenv 安装的特定版本,以及如果您禁用在poetry?
    【解决方案7】:

    作为一个 Python 新手,这个问题让我无休止地感到沮丧,并让我困惑了几个月。当我知道我将在未来几年内使用它时,我应该投资学习哪个虚拟环境和包管理器?

    回答这个棘手问题的最佳文章是 Jake Vanderplas 的 https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/。尽管已有几年历史,但它提供了实用的答案以及 Python 包和虚拟环境管理器在这些最先进技术的发展过程中的历史。

    在数据科学和“大数据云计算”社区中,我特别沮丧,因为 conda 被广泛用作 Python 和 JavaScript、SQL、Java、HTML5 和 Jupyter 的虚拟环境管理器和全功能包管理器笔记本。

    那么为什么要使用 pip,当 conda 完成 pip 和 venv 变体所做的所有事情时?

    答案是,“因为如果 conda 包根本不可用,您必须使用 pip。”很多时候,所需的包仅以 pip 格式提供,没有简单的解决方案,只能使用 pip。你可以学习使用conda build,但是如果你不是包维护者,那么你必须说服包所有者为每个新版本生成一个 conda 包(或者自己做。)

    这些基于 pip 的软件包在许多重要且实用的方面有所不同:

    • 稳定性
    • 成熟度
    • 复杂性
    • 积极支持(相对于死亡或死亡)
    • Python 生态系统“核心”与“在 边缘”(即,集成到 Python.org 发行版中)
    • 易于理解和使用(适合初学者)

    我会从包成熟度和稳定性两个维度来回答你的问题。

    venv 和 virtualenv 是最成熟、最稳定、最受社区支持的。从在线文档中,您可以看到 virtualenv 截至今天的版本为 20.x。 virtualenv

    virtualenv 是一个创建隔离 Python 环境的工具。自从 Python 3.3,它的一个子集已集成到标准中 venv 模块下的库。 venv 模块不提供所有 这个库的特点,仅举几个比较突出的:

    is slower (by not having the app-data seed method),
    
    is not as extendable,
    
    cannot create virtual environments for arbitrarily installed python versions (and automatically discover these),
    
    is not upgrade-able via pip,
    
    does not have as rich programmatic API (describe virtual environments without creating them).
    

    virtualenvwrapper 是一组帮助人们使用 virtualenv 的脚本(它是一个维护不善的“包装​​器”,它的最后一次更新是在 2019 年。virtualenvwrapper

    我的建议是尽可能避免使用所有 pip 虚拟环境。改用 conda。 Conda 提供了一种统一的方法。它由专业的开源开发人员团队维护,并有一家信誉良好的公司提供资金和商业支持的版本。相比之下,维护 pip、venv、virtualenv、pipenv 和许多其他 pip 变体的团队资源有限。 pip 虚拟环境的多样性对于初学者来说是令人沮丧的。基于 pip 的虚拟环境工具的复杂性、碎片化、边缘和不受支持的包以及极其不一致的支持促使我使用 conda。对于数据科学工作,我的建议是在 conda 包不存在时使用基于 pip 的虚拟环境管理器作为最后的手段。

    venv 变体之间的差异仍然让我感到害怕,因为我的时间有限,无法学习新的包。 pipenv、venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、诗歌和其他有几十个差异和复杂性,需要几天时间才能理解。我讨厌走上一条路,当维护者辞职(或太忙而无法维护它)时,对一个包的支持就会崩溃。我只需要完成我的工作。

    本着乐于助人的精神,这里有一些链接可以帮助您深入了解,但不要迷失在但丁的地狱(re:pip)中。

    A Guide to Python’s Virtual Environments

    选择“核心”Python 包来投资于你的职业生涯(长期),而不是短期完成工作)很重要。但是,这是一个业务分析问题。您是想简单地完成一项任务,还是一个专业的软件工程师构建可扩展的高性能系统,随着时间的推移需要最少的维护工作量?恕我直言,conda 比处理 pip-plurality 问题更容易将您带到后者。 conda 仍然缺少 1 步 pip-package 迁移工具,这使得这成为一个没有实际意义的问题。如果我们可以简单地将 pip 包转换为 conda 包,那么 pypi.org 和 conda-forge 可以合并。 Pip 是必要的,因为 conda 包(还)不是通用的。许多 Python 程序员要么懒得创建 conda 包,要么只用 Python 编程,不需要 conda 的语言无关/多语言支持。

    conda 对我来说是天赐之物,因为它支持云软件工程和数据科学对 JavaScript、SQL 和 Jupyter Notebook 扩展的多语言支持的需求,并且 conda 在 Docker 和其他云原生环境中运行良好。我鼓励您学习和掌握 conda,这将使您能够回避许多基于 pip 的工具可能永远无法回答的复杂问题。

    保持简单!我需要一个包来完成我需要的 90% 的工作,并为剩下的 10% 的边缘情况提供指导和解决方法。

    查看此处链接的文章,了解有关基于 pip 的虚拟环境的更多信息。

    我希望这对原始海报有所帮助,并让 pip 和 conda 爱好者有所思考。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多