Ubuntu 21.04,Virtualenv及其配置Python

Ubuntu 21.04, Virtualenv and its configuration of Python

编辑:


我正在使用 virtualenv 创建一个基于 Python 3.10 的虚拟环境。虽然 virtualenv 没有错误地完成并且似乎激活了,但它仍然无法获取自己的 Python 除非 已设置 PYTHONPATH 环境变量手动。

我不确定我面临的情况是由于 Ubuntu 合并 Python 的方式还是 virtualenv 设置环境的方式,以便它选择本地口译员。以下是我到目前为止收集的内容:

  1. 我的基本系统是 Ubuntu 21.04。它有自己的 Python 3 (Python3.9.5) 安装,除了使用 apt.

    安装 python3-virtualenv 包外,我根本没有接触过它
  2. 在 Python 3.10 中,我安装了 python3.10-dev 软件包并以通常的方式继续创建虚拟环境:

    1. > virtualenv -p python3.10 the_env/
    2. > source the_env/bin/activate
  3. 虽然到目前为止这看起来还不错,但是这个环境没有任何关于它自己的site-packages目录的信息。甚至 virtualenv 应该创建的包含 pip 的那个也不行。在此安装中,如果您尝试 > pip --version 您只会收到一个错误 pip 包不存在(pip“可执行”位置被正确拾取,但由于解释器对其 site-packages 一无所知,因此无法正确启动 pip)。

长话短说,我创建了两个环境,一个基于 Python3.9(完美运行),一个基于 Python3.10(不运行) 每个环境中的简单测试:

在此之后,我在激活环境之前手动定义了一个 PYTHONPATH ,该环境恰好指向该特定环境的 site-packages,并且一切正常预期。

怀疑 这可能与我系统的 Python 是 3.9 的事实有关,这意味着 USER_SITE 变量 有效,而在 Python3.10 的情况下,它不是(因为,我没有用它,这只是我正在创建的虚拟环境)。所以,我 怀疑 这可能会偏离 site module determines where things are.

不太清楚,想请教以下问题:

  1. 这是否与 Ubuntu 处理 Python 安装的方式有关,可能只是在虚拟环境中造成这个小问题?

  2. 问题可能出在没有明确指定 PYTHONPATHvirtualenv 上吗?

  3. 这种行为会不会是 site 模块的一种特殊情况?

对我有用的是从源代码安装。源码解包后总结一下:

$ ./configure --enable-optimizations --with-ensurepip=install --prefix=/path/to/install/to/
$ make -j
$ make test
$ make install
$ /path/to/install/to/bin/python3.10 -m venv /path/to/test
$ source /path/to/test/bin/activate
$ pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 58.1.0
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '/path/to/test/bin/python3.10 -m pip install --upgrade pip' command.
$ python -m pip install --upgrade pip
[...]
$ pip list
Package    Version
---------- -------
pip        21.3.1
setuptools 58.1.0

编辑

如下所述,我认为上述过程之所以有效,原因很简单,当从源代码构建和安装 Python 时,安装将是正确的,我怀疑 [= 中的 3.10 安装46=] 21.04 不是。

我 Python 从源代码安装在我的主目录下,以免搞砸,我也没有永久修改 PATH。

将路径设置为 $PATH:/path/to/install/to/bin 应该没问题,可以永久设置,也可以仅在 运行 mkvirtualenv.

时设置

这样做,我的新安装甚至似乎与我的系统 virtualenvwrapper.

无缝集成

我自己并不真的需要站在 Python 的前沿,但如果我这样做了,我肯定会通过使用描述的过程使自己独立于 Ubuntu 的最新发展以上。

顺便说一句,如果我直接在从源构建的 Python 安装中更新 pip,我将不再收到有关旧 pip 的消息(见上文)我安装了新的虚拟环境。

编辑 2

错误报告给 Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python3.10/+bug/1955742

编辑 3

此外,由于 Ubuntu 21.04 将在一个月左右的时间内结束,因此升级到 21.10 确实很有意义。我刚刚试过了,似乎 Python 3.10 虚拟环境在那个版本中工作得很好。

随着 Ubuntu 22.04 的出现(这导致我的一些特定 python virtualenv 设置出现了一些小问题)并且已经花了一些时间来解决这个问题,我最终切换到使用 pyenv.

Pyenv 使得安装任何 python 版本和其中任意数量的虚拟环境变得非常容易,这些虚拟环境可以在完全隔离的情况下进一步定制。

唯一要注意的是在安装特定版本之前安装所有必要的 python 先决条件,以避免缺少某些软件包的功能(例如,不包括 lzma 库会产生不祥的警告来自 pandas(“您的 python 安装不完整...”)。如果您不使用该功能,则可以忽略此信息,否则很容易修复。

如果您必须为 python 管理不同的版本和特定配置,我认为这是一个更好的整体选择,即使是跨发行版。

此解决方案与之前建议的解决方案(“从源代码安装”)非常接近,因此我将接受该解决方案并将我的贡献作为有关此问题的附加信息。