【问题标题】:what 'operations' does a python virtual enviornement really isolate?python虚拟环境真正隔离了哪些“操作”?
【发布时间】:2018-12-26 12:49:55
【问题描述】:

当使用 sudo apt-get install 安装软件包或在 python 虚拟环境中从源代码构建库时(我不是在谈论 pip install),在 python 虚拟环境中执行此操作是否会隔离正在安装的应用程序?我的意思是它们只存在于 python 虚拟环境中吗?

【问题讨论】:

  • 如果它与 Python 无关(就像大多数 apt-get 命令不会),它可能不会改变任何东西。
  • Python 虚拟环境不是一种虚拟化或容器化。它主要影响您的环境变量。

标签: python installation virtualenv installation-package


【解决方案1】:

虚拟环境为您提供的独立版本:

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

...仅此而已。

虚拟环境不会将您与:

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

【讨论】:

    【解决方案2】:

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

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

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

    当然,当在 virtualenv 中从源代码构建时,已安装的包会隐藏在该 virtualenv 中;没有其他 python 二进制文件可以访问这些包,除非你以奇怪的方式操纵你的路径或 PYTHONPATH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2022-12-15
      • 1970-01-01
      相关资源
      最近更新 更多