背景:我的最终目标是在我的 Ubuntu 20.04 机器上安装一个全新的 Python 3.11,这样我就可以测试我编写的一些使用 Python 3.11 新功能的代码。我并不是想替换我的系统 Python 或类似的东西,我只是想用 Python 3.11 进行测试。
我尝试过的:首先,我尝试直接通过 apt 安装 Python 3.11,但是当我这样做时apt-get install python3.11; python3.11 --version
,输出的 Python 版本是Python 3.11.0rc1
。但我想安装 Python 3.11 的最终稳定版本,而不是候选版本,所以我卸载了刚刚安装的 Python 3.11rc。
快速搜索让我找到了 deadsnakes PPA,因此我添加了 deadsnakes PPA,更新了 apt,并成功安装了 Python 3.11.0,这次不是候选版本(已通过 验证python3.11 --version
)。然后,我尝试通过 验证我是否进行了全新安装python3.11 -m pip list
,但它列出了近 70 个软件包。我尝试使用 删除所有这些软件包python3.11 -m pip remove <packages>
,但失败了,因为新安装的 Python 3.11 中的某些软件包是使用 distutils 构建的。我尝试检查是否有解决方法来卸载使用 distutils 构建的 Python 软件包,但我很快确定这超出了我的知识范围,我无法轻松地进行修改,甚至完全不可能。
因此,以下是我到目前为止所做的事情:
# first attempt at installing Python 3.11
> python3.11 --version #to ensure that I don't already have Python 3.11 installed
Command 'python3.11' not found, but can be installed with:
apt install python3.11
> python3 --version #to double ensure that my system Python version isn't 3.11
Python 3.10.6
> apt-get install python3.11 -y
> python3.11 --version
Python 3.11.0rc1
> apt-get remove python3.11 -y #removing unwanted rc version
> apt autoremove #removing additional python3.11-minimal and other packages that came when installing python3.11
# second attempt at installing Python 3.11
> add-apt-repository ppa:deadsnakes/ppa --yes
> apt update; apt-get update;
> apt-get install python3.11 -y
> python3.11 --version
Python 3.11.0
> python3.11 -m pip list
blinker 1.4
certifi 2020.6.20
chardet 4.0.0
<66 more packages cut for brevity...>
> python3.11 -m pip uninstall blinker certifi chardet <66 more packages cut for brevity> --yes
Found existing installation: blinker 1.4
ERROR: Cannot uninstall 'blinker'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
不知道该怎么办,我读了deadsnakes 主页仔细观察,我发现了这一点:
这里提供的软件包大致基于 debian 上游软件包,并进行了一些修改,以使其更适合用作非默认 python 和 ubuntu。
也许我完全误解了这一点,但我理解它的意思是“当您从 deadsnakes 安装 Python 时,我们会包含与 Ubuntu 系统 Python 相同的软件包集,外加一些额外的软件包。”这似乎解释了我的问题,或者至少,它可以解释为什么我安装的 Python 3.11 具有与我的系统 Python 相同的所有软件包,外加一些额外的软件包。
因此,我尝试找到一种方法来安装干净的空版本的 Python 3.11。我在之前的尝试中发现我实际上安装了多个软件包,包括python3.11-minimal
。我想也许这就是我需要的,所以我再次卸载了 Python3.11 并安装了python3.11-minimal
。这安装了 Python3.11,但python3.11 -m pip list
再次返回了 69 个软件包的列表,并且像以前一样,我无法删除它们,因为其中一些或全部都是用 distutils 构建的。
我认为这可能是 Python 3.11 特有的问题,因此我尝试安装旧版本的 Python,看看它们是否也附带了额外的软件包,但是当我安装 Python 3.8 和 Python 3.9 时,它们像 Python 3.11 一样附带了一堆额外的软件包。
我尝试在网上找到任何关于安装真正空版本的 Python 的参考资料,或者至少是安装后可以删除额外软件包的参考资料,但我什么也没找到。不过,我无法想象这是非常不寻常的事情,因为肯定有人曾经想要安装一个干净的非系统 Python 副本,而这个副本不附带额外的 60 多个软件包,对吧?
那么,除了系统 Python 之外,我如何才能安装一份干净的 Python 副本,而该副本不附带一堆不可移除的软件包?这可能吗?
在 Ubuntu 中,是否可以除了系统 Python 之外再安装一个版本的 Python,然后使用该辅助 Python 创建一个虚拟环境,并让该虚拟环境处于这样的状态:当您从该新虚拟环境中发出 pip 列表时,pip 不会列出 stdlib 之外的任何软件包(也许除了 pip/setuptools)?
答案1
在 Ubuntu 中,是否可以除了系统 Python 之外再安装一个版本的 Python,然后使用该辅助 Python 创建一个虚拟环境,并让该虚拟环境处于这样的状态:当您从该新虚拟环境中发出 pip 列表时,pip 不会列出 stdlib 之外的任何软件包(也许除了 pip/setuptools)?
是的,请参见下面的演示,假设您已经安装了python3.11
...这里供参考的是系统范围的python3.11 -m pip list
:
ubuntu@Lenovo:~$ python3.11 -m pip list
Package Version
---------------------- ---------------
agate 1.6.3
agate-dbf 0.2.2
agate-excel 0.2.5
agate-sql 0.5.8
apturl 0.5.2
attrs 21.2.0
Babel 2.8.0
bcc 0.18.0
bcrypt 3.2.0
beautifulsoup4 4.10.0
blinker 1.4
Brlapi 0.8.3
certifi 2020.6.20
chardet 4.0.0
chrome-gnome-shell 0.0.0
click 8.0.3
colorama 0.4.4
command-not-found 0.3
cryptography 3.4.8
csvkit 1.0.6
cupshelpers 1.0
dbfread 2.0.7
dbus-python 1.2.18
defer 1.0.6
distro 1.7.0
distro-info 1.1build1
duplicity 0.8.21
et-xmlfile 1.0.1
fasteners 0.14.1
future 0.18.2
greenlet 1.1.2
html5lib 1.1
httplib2 0.20.2
idna 3.3
importlib-metadata 4.6.4
iniconfig 1.1.1
isodate 0.6.1
jdcal 1.0
jeepney 0.7.1
keyring 23.5.0
language-selector 0.1
launchpadlib 1.10.16
lazr.restfulclient 0.14.4
lazr.uri 1.0.6
leather 0.3.4
libevdev 0.5
libvirt-python 8.0.0
lockfile 0.12.2
louis 3.20.0
lxml 4.8.0
macaroonbakery 1.3.1
Mako 1.1.3
MarkupSafe 2.0.1
monotonic 1.6
more-itertools 8.10.0
netaddr 0.8.0
netifaces 0.11.0
oauthlib 3.2.0
olefile 0.46
openpyxl 3.0.9
packaging 21.3
paramiko 2.9.3
parsedatetime 2.6
pexpect 4.8.0
Pillow 9.0.1
pip 22.0.2
pluggy 0.13.0
protobuf 3.12.4
ptyprocess 0.7.0
py 1.10.0
pycairo 1.20.1
pycups 2.0.1
Pygments 2.11.2
PyGObject 3.42.1
PyICU 2.8.1
PyJWT 2.3.0
pymacaroons 0.13.0
PyNaCl 1.5.0
pyparsing 2.4.7
pyRFC3339 1.1
pytest 6.2.5
python-apt 2.3.0+ubuntu2.1
python-dateutil 2.8.1
python-debian 0.1.43ubuntu1
python-slugify 4.0.0
pytimeparse 1.1.5
pytz 2022.1
pyudev 0.22.0
pyxdg 0.27
PyYAML 5.4.1
reportlab 3.6.8
requests 2.25.1
SecretStorage 3.3.1
setuptools 59.6.0
six 1.16.0
soupsieve 2.3.1
SQLAlchemy 1.4.31
ssh-import-id 5.11
systemd-python 234
toml 0.10.2
ubuntu-advantage-tools 27.11.3
ubuntu-drivers-common 0.0.0
ufw 0.36.1
unattended-upgrades 0.1
Unidecode 1.3.3
urllib3 1.26.5
usb-creator 0.3.7
vboxapi 1.0
wadllib 1.3.6
webencodings 0.5.1
wheel 0.37.1
xdg 5
xkit 0.0.0
xlrd 1.2.0
zipp 1.0.0
第一种方法(和python3.11-venv
...Jammy 及以上):
ubuntu@Lenovo:~$ sudo apt install python3.11-venv
.
.
.
ubuntu@Lenovo:~$ mkdir venv_1 && cd venv_1
ubuntu@Lenovo:~/venv_1$ python3.11 -m venv env
ubuntu@Lenovo:~/venv_1$ source env/bin/activate
(env) ubuntu@Lenovo:~/venv_1$ python3.11 -m pip list
Package Version
---------- -------
pip 22.0.2
setuptools 59.6.0
(env) ubuntu@Lenovo:~/venv_1$
第二种方法(使用virtualenv -p [ path to python3.11 executable ]
...查找可执行文件,例如which python3.11
):
ubuntu@Lenovo:~$ pip3 install virtualenv
.
.
.
ubuntu@Lenovo:~$ mkdir venv_2 && cd venv_2
ubuntu@Lenovo:~/venv_2$ virtualenv env -p /bin/python3.11
ubuntu@Lenovo:~/venv_2$ source env/bin/activate
(env) ubuntu@Lenovo:~/venv_2$ python3.11 -m pip list
Package Version
---------- -------
pip 22.3.1
setuptools 65.6.3
wheel 0.38.4
(env) ubuntu@Lenovo:~/venv_2$