如何用打包版本替换从源安装的 Python?

How do I replace a Python installed from source with a packaged version?

由于正在准备 Python 3.7,我从源代码安装了 Python 3.7.0b3。现在 3.7 已经出来了,我想使用为 Ubuntu 打包的版本。所以我已经完成了

apt-get install python3.7

但是

$ which python3.7
/usr/local/bin/python3.7

$ /usr/local/bin/python3.7 --version 
Python 3.7.0b3

如何卸载从源(在 Ubuntu 上)安装的 Python? 或者如何替换成apt repo打包的版本?

由于您开启了赏金任务,我无法投票关闭重复任务,但 this question 似乎提供了一个可能的解决方案。引用已接受的答案:

You can use checkinstall to remove Python. The idea is:

  1. Install checkinstall
  2. Use checkinstall to make a deb of your Python installation
  3. Use dpkg -r to remove the deb.

checkinstall 基本上包装了一个 make install 命令并根据安装的内容创建了一个 Debian .deb 包。然后,您只需卸载该软件包即可完全恢复 make install。为了绝对安全,您可能需要先卸载打包的 Python 3.7 并在之后重新安装它以避免任何冲突(不过我不希望有任何冲突,因为打包版本位于 /usr 而您的源版本位于/usr/local).

如果您没有源文件了,您可以随时重新下载它们 (https://www.python.org/downloads/release/python-370b3/) 并重建 Python。具体来说,checkinstall 命令看起来像这样:

sudo apt install checkinstall
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0b3.tgz
tar xf Python-3.7.0b3.tgz
cd Python-3.7.0b3
./configure && make
sudo checkinstall -D --fstrans=no make install
sudo dpkg -r Python-3.7.0b3.deb

-D 创建一个 Debian 软件包,--fstrans=no 禁止使用临时目录进行安装)。

因为我也在迁移到 python 3.7,所以我遇到了这个问题并决定回答它,并完成我的安装。 这是我在 ubuntu 16.04 上安装 python 3.7 时使用的两个来源: https://askubuntu.com/questions/865554/how-do-i-install-python-3-6-using-apt-get https://superuser.com/questions/241865/updating-python-on-ubuntu-system

显然从第一个来源来看,deadsnakes PPA 包含 Python 3.7 - Link: https://github.com/deadsnakes/python3.7/tree/ubuntu/xenial/Python

因此,根据我的第一个来源,我使用以下命令安装 Python 3.7:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.7

它安装 Python 3.7 成功,但我的 Python 3.5.2 保持默认。您可以通过 运行 命令 invoke/use Python 3.7:

python3.7 script.py

它有效,所以我决定通过删除 python 3.5 将 Python 3.7 设置为默认值,但我遇到了我的第二个来源,并决定坚持使用 python3.7 ,当 运行 我的脚本在终端中时。

显然它说: Ubuntu 广泛用于编写最终用户软件的政策。所以基本上,系统的很大一部分是用Python写的。要切换到 Python 3.7,需要完成一项工作,包括更新和重新测试所有脚本。

所以说你不能只切换到 Python 3.7 并删除旧版本。

还有来自我的第一个消息来源的评论指出删除旧版本可能会破坏系统。我还没有删除我的旧版本以防它可能破坏系统,但由于您询问如何下载 Python 3.7,我认为我的第一个来源和我的回答的第一部分应该工作。

希望对您有所帮助:)

您从源代码构建的 Python 似乎在 /usr/local 下,并且您的 PATH 变量在 /usr/bin 之前有 /usr/local/bin,因为 运行ning python3.7 为您提供 /usr/local 下的那个,而不是 /usr/bin/python3.7.

下的打包的那个

查看您的 PATH 以验证这一点。

echo $PATH

(当您 运行 bash 中的程序时,那个特定的 运行ning bash 实例将记住该位置并且不会重新扫描 PATH 再次为该程序,因此它不会注意到 PATH 中较早出现的新文件。您可以通过 运行 宁 hash -r 重置缓存或通过只是退出 shell 并再次启动它。)

我假设您的目标是 python3.7(或 Python 提供的任何其他命令)到 运行 您在 /usr 中打包安装的版本。

不幸的是,python 构建过程不提供卸载方法 -- 仅删除由源 Python 安装的文件的唯一自动方法需要提前使用其他工具(例如如 checkinstall)。

所以你有一些选择:

  • 更改 PATH,使 /usr/local/bin/usr/bin 之后。为此,请编辑您的 ~/.profile 文件或您配置 PATH 和 logout/login 的任何其他脚本。这也会影响您 运行 在 /usr/local/bin/usr/bin 中可用的任何其他命令。

  • 删除 /usr/local 并重新安装任何你想要的东西。如果 Python 安装是您 /usr/local 中唯一的东西,或者如果您可以轻松地重新安装那里的任何其他东西,那么这可能是可行的方法。

  • 煞费苦心地找出 /usr/local/bin 下的哪些文件是 Python 的一部分并将它们删除。您可以使用已安装的 python3 软件包中 /usr/bin 中的相应文件作为起点,找出 /usr/local/bin.

  • 的相似名称

从已安装的 python3* 包中获取 /usr/bin 中的文件列表的单行程序:

$ for pkg in $(dpkg -l 'python3*' | grep '^ii' | cut -f 3 -d' '); do dpkg -L $pkg | grep '^/usr/bin/'; done | sort

这应该会生成如下文件列表:

/usr/bin/2to3-3.x
/usr/bin/chardet3

...

(我已经在 Debian 上测试了这个单行程序,我不确定 Ubuntu 是否需要任何更改)