python虚拟环境真正隔离了哪些“操作”?

时间:2018-12-26 12:49:56

标签: python installation virtualenv installation-package

在使用sudo apt-get install安装软件包或在python虚拟环境中从源代码构建库时(我不是在说pip install),在python虚拟环境中进行安装是否可以隔离正在安装的应用程序?我的意思是它们仅存在于python虚拟环境中吗?

2 个答案:

答案 0 :(得分:1)

根据@deceze的评论,虚拟环境对apt操作没有影响。

从源代码构建时,所有已编译的二进制文件都将链接到该环境的python二进制文件。因此,如果您的virtualenv python版本与系统版本不同,并且您使用系统python(通常是路径问题),则可能会遇到运行时链接错误。

对于隔离,相同的属性(二进制兼容性)将您从系统升级中隔离,这可能会更改系统python二进制文件。通常,我们在2.x和3.x中是稳定的,因此不太可能发生。但是有并且可以。

当然,当从virtualenv内部的源代码构建时,已安装的程序包会存放在该virtualenv中。除非您以奇怪的方式操纵路径或PYTHONPATH,否则其他python二进制文件都无法访问这些软件包。

答案 1 :(得分:1)

虚拟环境为您提供以下版本的隔离版本:

  • 您将获得一个单独的PATH条目,因此对pythonpip等的不合格命令行引用将引用所选的Python发行版。如果您在系统上安装了许多Python副本(在开发人员工作站上很常见),这可能会很方便。这意味着像#!/usr/bin/env python这样的shebang行将在virtualenv内部(至少在Unix或类似Unix的系统上)“做正确的事”。
  • 您将获得一个单独的site-packages目录,因此Python软件包(使用pip安装或使用setup.py build在此环境中本地构建)是在virtualenv本地安装的,而不是在系统中安装的范围内的位置。在将核心Python解释器安装在不允许非特权用户写入文件的地方的系统上,这特别有用,因为它允许每个用户拥有自己的私有虚拟环境,并安装了第三方软件包,而无需使用{{ 1}}或相当的软件来在系统范围内安装这些第三方软件包。

...就是这样。

虚拟环境不会不会将您隔离:

  • 您的操作系统(Linux,Windows)或计算机体系结构(x86)。
  • 直接引用特定Python解释器的脚本(例如sudo)。
  • 系统#!/usr/bin/python上的非Python事物(例如,通过操作系统的程序包管理器安装的第三方程序或实用程序)。
  • 已安装到特定于操作系统的位置(例如PATH/usr/lib/usr/include/usr/local/lib)中的非Python库或标头。
  • 使用操作系统的程序包管理器(例如/usr/local/include)而不是Python程序包管理器(apt)安装的Python程序包可能在virtualenv的pip文件夹中不可见,但此类软件包的“本机”部分(例如,site-packages)(可能)仍然可见。