Virtualenv 将 env 安装到 local/bin 而不是 bin

ice*_*lon 10 python3 virtualenv virtualenvwrapper 22.04

问题:

bin我用virtualenvwrappervirtualenv在后台使用)生成的虚拟环境的目录位于子文件夹中,local而不是导致全面损坏(主要virtualenvwrappervscode目前)。基本上,这些工具期望解释器位于<envname>/bin而不是位于<envname>/local/bin.

信息:

我已经做了一些研究并发现了以下内容:

  • Ubuntu 22.04 中进行了更改,现在posix_local在模块中使用sysconfig而不是作为posix_prefix默认方案,这在此处进行了解释
  • Virtualenv 在某个时候引入了一个 Python 2 补丁,该补丁将位置更改binlocal/bin虚拟环境内部以响应前缀,这是在这个问题posix_local中提出的,并产生了这个补丁,该补丁应该修复这个错误

系统:

  • Ubuntu 22.04 LTS x86_64
  • python3 - 3.10.4-0ubuntu2
  • python3-virtualenv - 20.13.0+ds-2
  • 虚拟环境包装器==4.8.4

问题:

  • 如何virtualenv再次安装我的环境<envname>/bin,忽略posix_local选项?
  • 修复此问题的原因是否仍然适用于 Python 3?(我必须承认,我一开始并没有真正理解为什么需要这个补丁。)

ice*_*lon 13

原答案

virtualenv的 GitHub 上的用户yingmanwumen发布了该问题的解决方案:

基本上,他们通过在选择的 shell 中导出以下变量来更改 sysconfig 方案:

export DEB_PYTHON_INSTALL_LAYOUT='deb'
Run Code Online (Sandbox Code Playgroud)

这会将默认安装方案从posix_local产生问题行为的 更改为deb_system,再次具有正常/预期的虚拟环境布局。可以使用以下片段检查当前的安装方案:

import sysconfig
print(sysconfig.get_default_scheme())
Run Code Online (Sandbox Code Playgroud)

需要注意的是,这是一个临时解决方案。真正的解决方案可能包括改变这种行为本身virtualenvyingmanwumen 的问题以及我自己的问题都解决了该posix_local计划的问题。的开发人员virtualenv愿意接受 PR 来解决根本问题。如果提出并接受解决该问题的 PR,我将更新此答案。


更新

专门为 解决此问题的PR已被接受virtualenv,这意味着 的所有版本virtualenv > 20.16.5都不应再出现此问题。

此外,该错误似乎在以下情况下才会发生:

[...] python3-distutils 未安装(或未使用deadsnakes分支时)

根据PR的提议者的说法。因此,如果遇到此问题,安装或使用deadsnakespython3-distutils fork版本也应该可以解决此问题。

最后,我们也在 Debian/Ubuntu 中努力解决这个问题,并使该posix_prefix方案总体上更加稳健。正如本次讨论中所见,这并不是由于安装方案混乱而发生的第一个问题。