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

时间:2018-07-14 21:12:23

标签: python uninstall apt

在准备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

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

3 个答案:

答案 0 :(得分:10)

自您打开赏金以来,我无法投票决定关闭重复项,但是this question似乎提供了一种可能的解决方案。引用已接受的答案:

  

您可以使用checkinstall删除Python。这个想法是:

     
      
  1. 安装checkinstall
  2.   
  3. 使用       检查安装以使您的经验丰富       Python安装
  4.   
  5. 使用dpkg -r来       删除deb。
  6.   

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禁止使用临时目录进行安装)。

答案 1 :(得分:3)

由于我也转向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

显然,第一个消息来源的死神PPA包含Python 3.7-链接: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仍然是默认设置。您可以通过运行以下命令来调用/使用Python 3.7:

python3.7 script.py

它起作用了,所以我决定通过删除python 3.5来将Python 3.7设置为默认值,但是我遇到了第二个源代码,只是决定在终端中运行脚本时坚持使用python3.7。 / p>

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

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

从我的第一个消息来源的评论中也可以看出,删除旧版本可能会破坏系统。为了防止系统崩溃,我还没有删除过我的旧版本,但是由于您正在询问如何下载Python 3.7,因此我认为我的第一篇文章和答案的第一部分应该起作用。 >

我希望这会有所帮助:)

答案 2 :(得分:2)

似乎您从源代码构建的Python在/usr/local下,并且PATH变量在/usr/local/bin之前有/usr/bin,因为运行python3.7可以使您/usr/local下的一个,而不是/usr/bin/python3.7下的打包的。

查看您的PATH进行验证。

echo $PATH

(当您在bash中运行程序时,正在运行的特定bash实例将记住该位置,而不会再次扫描该程序在PATH中的目录,因此不会请注意,新文件出现在PATH的较早位置。您可以通过运行hash -r重置缓存或退出shell并再次启动来防止这种情况。

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

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

所以您有一些选择:

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

  • 删除/usr/local并在此处重新安装其他任何您想要的东西。如果您的/usr/local中只有Python安装,或者可以轻松地重新安装其中的其他任何东西,那么这可能就是解决方法。

  • 辛苦地找出/usr/local/bin下的哪些文件是Python的一部分并将其删除。您可能可以使用已安装的/usr/bin软件包中python3中的相应文件作为起点来找出/usr/local/bin的相似名称。

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

$ 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是否需要任何更改)