代码之家  ›  专栏  ›  技术社区  ›  cluster1

在理解为什么python需要虚拟环境的原因时挣扎

  •  1
  • cluster1  · 技术社区  · 6 年前

    来自javascript,我熟悉NPM。

    在那里,您可以全局(通过使用-g标志)或本地在项目中安装包。 在Python中,它们有这些虚拟环境。 我还是有点不确定为什么需要它们。我知道这是因为在一台机器上有不同版本的相同包。

    是因为python没有本地项目安装的概念吗?

    所有的软件包安装都是全局安装的,这是不可能的。在我看来是这样的… 所以他们有虚拟环境吗?

    我就在那里?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Josh Karpel    6 年前

    是因为python没有本地项目安装的概念吗?

    对的。

    嗯,基本上是正确的。有许多“现代”的python包管理器支持项目本地包安装。现在两个大的是 pipenv poetry .

    但是,所有这些库都是基本的Python虚拟环境机制的包装器。它是生态系统的基础。

    在python中,全局包管理有点棘手,因为unix系统往往带有一个支持部分操作系统的“system python”安装。在系统python中安装/更新包是 非常坏的主意 因此,您总是希望在自己安装的Python中工作,要么是完全独立的安装,要么至少是系统Python的虚拟环境。

        2
  •  2
  •   geckos    6 年前

    虚拟环境使您能够按项目封装依赖项。

    巨蟒没有 node_modules 等效。当你用 pip 它转到您的 站点包 文件夹。要查找此文件夹,可以运行 python -m site 它将打印出它将在其中搜索包的文件夹。

    Fedora 29示例:

    ➜  ~ python -m site
    sys.path = [
        '/home/geckos',
        '/usr/lib/python27.zip',
        '/usr/lib64/python2.7',
        '/usr/lib64/python2.7/plat-linux2',
        '/usr/lib64/python2.7/lib-tk',
        '/usr/lib64/python2.7/lib-old',
        '/usr/lib64/python2.7/lib-dynload',
        '/usr/lib64/python2.7/site-packages',
        '/usr/lib/python2.7/site-packages',
    ]
    USER_BASE: '/home/geckos/.local' (exists)
    USER_SITE: '/home/geckos/.local/lib/python2.7/site-packages' (doesn't exist)
    ENABLE_USER_SITE: True
    

    PIP与包管理器

    如果不使用虚拟环境,则可能最终会与操作系统python软件包并排安装软件包,这就是危险所在。包可能被覆盖,事情会很快变得混乱。例如,使用pip安装flask,然后尝试使用package manager安装jinja2,现在移除jinja2并断开flask,或者更新系统,jinja2得到更新,但flask没有更新。或者更简单地说,使用包管理器安装一些东西,然后使用pip删除,知道包管理器处于中断状态。

    因此,我们总是使用虚拟环境,甚至按项目分离虚拟环境。

    创建和维护虚拟环境

    没有什么能阻止您将虚拟环境维护在与项目相同的文件夹中。这样你也会有同样的 伐木 你拥有的节点模块。你可以用

    virtualenv <SOME_FOLDER> 对于python 2 或 python3 -m venv <SOME_FOLDER> 对于python 3

    我见过的惯例

    如果您将虚拟环境保留为项目的子文件夹,我通常会调用 env venv

    其他的选择是把所有的东西都放在你家里的同一个文件夹里,我一直在用 ~/.venv/<PROJECT>

    皮彭夫

    最后还有一个选择,我更喜欢纯的 匹普 . pipenv是一个为您自动管理虚拟环境的工具。感觉更接近 纱线 有更多的特点

    为项目创建虚拟环境 pipenv --tree pipenv --two 在项目文件夹中。它将创建和管理虚拟环境,并将依赖项写入pipenv文件。它还支持开发包,我真的认为值得尝试。这是文件: https://docs.pipenv.org/en/latest/

    我希望这有帮助,问候