努力理解Python需要虚拟环境的原因

时间:2019-06-15 14:16:34

标签: python

来自JavaScript,我对NPM很熟悉。

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

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

所有软件包安装都已全局安装,因此无法解决。在我看来就是那样... 所以他们有虚拟环境吗?

我在那里吗?

2 个答案:

答案 0 :(得分:4)

虚拟环境使您可以按项目封装依赖项。

Python没有等效的node_modules。当您使用pip安装某些程序时,它将转到您的 site-packages 文件夹。要找出该文件夹,您可以运行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 vs程序包管理器

如果您不使用虚拟环境,则最终可能会导致软件包与操作系统python软件包并排安装,这就是危险所在。程序包可能会被覆盖,事情很快就会变得混乱。例如,您使用pip安装Flask,然后尝试使用package-manager从中安装Jinja2,现在您删除Jinja2,并破坏Flask,或者更新系统,Jinja2得到了更新,但Flask没有。甚至更简单,您可以使用软件包管理器安装某些东西,然后使用pip删除,知道软件包管理器处于损坏状态。

因此,我们始终使用虚拟环境,甚至按项目分开使用虚拟环境。

创建和维护虚拟环境

没有什么可以阻止您将虚拟环境维护在与项目相同的文件夹中。这样,您将拥有与node_modules相同的 felling 。您可以使用

创建它

virtualenv <SOME_FOLDER> for python 2 要么 python3 -m venv <SOME_FOLDER>用于python 3

我见过的公约

如果您将虚拟环境保留为项目的子文件夹,那么我通常会打电话给envvenv

其他选择则将所有内容保留在您家中的同一文件夹中,我一直在使用~/.venv/<PROJECT>

Pipenv

最后,除了纯pip,我还有其他选择。 Pipenv是可自动为您管理虚拟环境的工具。感觉更接近 yarn ,并具有更多功能

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

我希望这会有所帮助

答案 1 :(得分:1)

  

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

正确。

好吧,基本上是正确的。有许多“现代” Python程序包管理器支持项目本地程序包安装。现在,最大的两个是pipenvpoetry

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

全局包管理在Python中有点棘手,因为Unix系统通常带有支持系统部分操作系统的“系统Python”安装。在系统Python中安装/更新软件包是一个非常不好的主意,因此您始终希望使用自己安装的Python工作,或者是完全独立的安装,或者至少是系统Python的虚拟环境