Ubuntu 21.04,Virtualenv及其配置Python
Ubuntu 21.04, Virtualenv and its configuration of Python
编辑:
- 除了下面列出的行为外,基于 Python3.10 的环境似乎忽略了使用
pip -e
选项安装的包(开发模式 ).
- 具体来说,在开发模式下安装的包未在
pip freeze
中列出(它在基于 Python3.9 的虚拟环境中列出)并且简单的 import <package_name>
失败。如果软件包安装正常(即 不是 在开发模式下)一切都按预期工作。
我正在使用 virtualenv
创建一个基于 Python 3.10 的虚拟环境。虽然 virtualenv
没有错误地完成并且似乎激活了,但它仍然无法获取自己的 Python 除非 已设置 PYTHONPATH
环境变量手动。
我不确定我面临的情况是由于 Ubuntu 合并 Python 的方式还是 virtualenv 设置环境的方式,以便它选择本地口译员。以下是我到目前为止收集的内容:
我的基本系统是 Ubuntu 21.04。它有自己的 Python 3 (Python3.9.5) 安装,除了使用 apt
.
安装 python3-virtualenv
包外,我根本没有接触过它
在 Python 3.10 中,我安装了 python3.10-dev
软件包并以通常的方式继续创建虚拟环境:
> virtualenv -p python3.10 the_env/
> source the_env/bin/activate
虽然到目前为止这看起来还不错,但是这个环境没有任何关于它自己的site-packages
目录的信息。甚至 virtualenv
应该创建的包含 pip
的那个也不行。在此安装中,如果您尝试 > pip --version
您只会收到一个错误
pip
包不存在(pip
“可执行”位置被正确拾取,但由于解释器对其 site-packages
一无所知,因此无法正确启动 pip)。
长话短说,我创建了两个环境,一个基于 Python3.9(完美运行),一个基于 Python3.10(不运行) 每个环境中的简单测试:
> python -m site
- 在 Python3.9 环境中,
sys.path
包含 一条通往此特定环境 site-packages
[= 的路径104=]
- 在 Python3.10 环境中,
sys.path
不 包含该特定路径,但仍包含您期望找到的典型路径(例如那些指向解释器本身和顶级环境目录,但 不是 指向 site-packages
位置的特定路径。
在此之后,我在激活环境之前手动定义了一个 PYTHONPATH
,该环境恰好指向该特定环境的 site-packages
,并且一切正常预期。
我 怀疑 这可能与我系统的 Python 是 3.9 的事实有关,这意味着 USER_SITE
变量 是 有效,而在 Python3.10 的情况下,它不是(因为,我没有用它,这只是我正在创建的虚拟环境)。所以,我 怀疑 这可能会偏离 site
module determines where things are.
不太清楚,想请教以下问题:
这是否与 Ubuntu 处理 Python 安装的方式有关,可能只是在虚拟环境中造成这个小问题?
问题可能出在没有明确指定 PYTHONPATH
的 virtualenv
上吗?
这种行为会不会是 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 管理不同的版本和特定配置,我认为这是一个更好的整体选择,即使是跨发行版。
此解决方案与之前建议的解决方案(“从源代码安装”)非常接近,因此我将接受该解决方案并将我的贡献作为有关此问题的附加信息。
编辑:
- 除了下面列出的行为外,基于 Python3.10 的环境似乎忽略了使用
pip -e
选项安装的包(开发模式 ). - 具体来说,在开发模式下安装的包未在
pip freeze
中列出(它在基于 Python3.9 的虚拟环境中列出)并且简单的import <package_name>
失败。如果软件包安装正常(即 不是 在开发模式下)一切都按预期工作。
我正在使用 virtualenv
创建一个基于 Python 3.10 的虚拟环境。虽然 virtualenv
没有错误地完成并且似乎激活了,但它仍然无法获取自己的 Python 除非 已设置 PYTHONPATH
环境变量手动。
我不确定我面临的情况是由于 Ubuntu 合并 Python 的方式还是 virtualenv 设置环境的方式,以便它选择本地口译员。以下是我到目前为止收集的内容:
我的基本系统是 Ubuntu 21.04。它有自己的 Python 3 (Python3.9.5) 安装,除了使用
安装apt
.python3-virtualenv
包外,我根本没有接触过它在 Python 3.10 中,我安装了
python3.10-dev
软件包并以通常的方式继续创建虚拟环境:> virtualenv -p python3.10 the_env/
> source the_env/bin/activate
虽然到目前为止这看起来还不错,但是这个环境没有任何关于它自己的
site-packages
目录的信息。甚至virtualenv
应该创建的包含pip
的那个也不行。在此安装中,如果您尝试> pip --version
您只会收到一个错误pip
包不存在(pip
“可执行”位置被正确拾取,但由于解释器对其site-packages
一无所知,因此无法正确启动 pip)。
长话短说,我创建了两个环境,一个基于 Python3.9(完美运行),一个基于 Python3.10(不运行) 每个环境中的简单测试:
> python -m site
- 在 Python3.9 环境中,
sys.path
包含 一条通往此特定环境site-packages
[= 的路径104=] - 在 Python3.10 环境中,
sys.path
不 包含该特定路径,但仍包含您期望找到的典型路径(例如那些指向解释器本身和顶级环境目录,但 不是 指向site-packages
位置的特定路径。
- 在 Python3.9 环境中,
在此之后,我在激活环境之前手动定义了一个 PYTHONPATH
,该环境恰好指向该特定环境的 site-packages
,并且一切正常预期。
我 怀疑 这可能与我系统的 Python 是 3.9 的事实有关,这意味着 USER_SITE
变量 是 有效,而在 Python3.10 的情况下,它不是(因为,我没有用它,这只是我正在创建的虚拟环境)。所以,我 怀疑 这可能会偏离 site
module determines where things are.
不太清楚,想请教以下问题:
这是否与 Ubuntu 处理 Python 安装的方式有关,可能只是在虚拟环境中造成这个小问题?
问题可能出在没有明确指定
PYTHONPATH
的virtualenv
上吗?这种行为会不会是
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 管理不同的版本和特定配置,我认为这是一个更好的整体选择,即使是跨发行版。
此解决方案与之前建议的解决方案(“从源代码安装”)非常接近,因此我将接受该解决方案并将我的贡献作为有关此问题的附加信息。