python-3.x - Ubuntu 21.04、Virtualenv 及其 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) 安装,除了
python3-virtualenv
使用apt
.在 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
- 在 Python3.10 环境中,
sys.path
不包括该特定路径,但仍包括您希望找到的典型路径(例如,指向解释器本身和顶级环境目录的路径,但不包括指向该site-packages
位置的特定路径。
- 在 Python3.9 环境中,
PYTHONPATH
在此之后,我手动定义了一个,然后激活完全指向site-packages
该特定环境的环境,并且一切都按预期工作。
我怀疑这可能与我系统的 Python 为 3.9 的事实有关,这意味着该USER_SITE
变量是有效的,而在 Python3.10 的情况下,它不是(因为我没有用它,这个只是我正在创建的虚拟环境)。因此,我怀疑这可能会偏离site
模块确定事物位置的方式。
由于我不确定,我想问以下问题:
这是否与 Ubuntu 处理 Python 安装的方式有关,这可能只是在虚拟环境中产生了这个小问题?
问题可能
virtualenv
出在没有明确指定 aPYTHONPATH
吗?这种行为可能是
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 时,安装是正确的,我怀疑 Ubuntu 21.04 中的 3.10 安装不是正确的。
我从我的主目录下的某个地方的源代码安装了我的 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 虚拟环境在该版本中工作得很好。
推荐阅读
- javascript - 由 javascript 更新的 html 按钮的模态问题
- php - Binance API仅出售利润和所有头寸
- python-3.x - 在 DoFn 中包装 WriteToText
- python - 如何正确防止从 Django Admin 中的内联中删除实例?
- thingsboard - Botched Thingsboard 从 2.5.6 升级到 3.0.0
- javascript - 在 mongodb update 语句中访问带空格的字段
- javascript - Ajax .load() 在 jQuery 3.5 中返回“未定义错误”,同一行在 jQuery 2.10 中有效
- c++ - SDL2 可以捕获全局击键吗?
- c# - 为什么我没有在递送状态电子邮件中收到 Original-Envelope-Id 标头?
- javascript - 如何将基于 React 类的组件转换为函数式组件?