conda和ros的共存管理是非常简单的,只要明白我们调用python的时候,其实是调用的对应位置的python程序。比如ros下,调用的是我们系统/usr/bin/python路径下的python程序,conda的话就是调用的~/anaconda3/envs/bin/python这个路径下的python程序,所以我们来管理他们的共存也就是管理不同python地址的指向而已。
我们可以在terminal里面输入which python来看一下使用的是哪个python程序。
在这里插入图片描述
那么怎样知道具体的python是指哪个版本呢?
在这里插入图片描述
我们依次执行

cd /usr/bin
ls -l python*

我们可以看到python2是链接到了python2.7,但是python3比较奇怪,是链接到了一个奇怪的东西,这个是因为我是先使用的conda环境,直接初始化了,后来又用的ros,所以中间做了些处理,如果和我同样情况的,也可以按照相同的处理办法即可解决,后面我会说怎么处理。如果是先使用的ros,后用的conda,这个地方应该和python2类似,直接显示链接到哪个python版本的程序。

我们再跳转到/etc/alternatives文件夹去看看

在这里插入图片描述
我们看到其实最终是链接到了python3.8。
因为我用的ROS2 foxy,链接到python3.8是没问题的。

下面就来具体说说共存管理,这里分为两种情况:

情况一:安装conda的时候没有激活自动初始化conda环境选项,或者还没有安装conda

激活自动初始化conda环境选项是什么意思呢 ?在安装conda的时候,最后一步有一个是否 init conda,如果选yes,conda会在我们的bashrc中添加上如下的代码:
在这里插入图片描述
检查一下自己的.bashrc文件,如果有这段代码,说明就是激活了conda的自动初始化。
还有一种鉴别方式是,如果新开一个终端,终端会自动添加(base)的标识符,就是激活了conda的自动初始化,如果没有这个标识符,就是没有激活。
情况一针对没有激活conda自动初始化的小伙伴,或者还没有安装conda的小伙伴。如果将要安装conda的话,为了省心,建议不要选择conda的自动初始化功能,而且这个功能在安装的时候也是默认关闭的。

这种类型就非常简单了,我们只需要在用到conda的环境的时候,手动激活conda的工作空间就可以了,这时候python的路径就会切换到conda的python,我们另开一个终端,又是ros的系统python。但是我们在激活conda的工作空间的时候,使用.bashrc提供的alias功能简化一下指令。

具体操作:

vi ~/.bashrc

在文件最后添加

alias setconda='. ~/miniconda3/bin/activate'

这里,alias是 .bashrc 提供的一个功能,给冗长的指令添加一个简短的别名,setconda可以自己随便换一个喜欢的名字,这个就是我们在终端执行,来唤醒conda环境的指令,如果用的是anaconda,要把miniconda3换成anaconda3,activate程序是conda官方提供用来激活conda工作空间的,. 的作用和source是一样的,所以这句和source ~/miniconda3/bin/activate是一样的,用.更加简单一些,注意.后面有一个空格。
(注意:ros环境激活的指令是可以放在bashrc里的,我们默认是首先激活ros的环境,需要用conda环境的时候,再手动激活conda的环境)

保存退出,重新开一个终端。

我们执行一个ros2 topic list,看看ros是否能正常工作
在这里插入图片描述
发现是没问题的。

我们看一下python路径,执行一个which python
在这里插入图片描述
发现也是系统python路径,满足ros的使用要求。

然后我们再激活一下conda的环境,我们在bashrc里面设置的激活指令是setconda,我们执行一下
在这里插入图片描述
可以看到前面的(base)标识已经开启,而且python也变为了conda的python,这样就可以正常使用conda了,我们执行个conda env list
在这里插入图片描述
也是没有问题的。

情况二:已经激活过conda的自动初始化

关于怎样鉴别是否激活了conda的自动初始化,在情况一开始的部分有说明。

这种情况稍微麻烦一些,笔者也属于这种情况。

(笔者建议:如果conda的环境不太重要的话,建议直接卸载掉conda重新安装,走情况一那种方式,如果conda环境很重要,卸载的成本很大的话,那么就按下面的步骤走)

第一步:注释掉 .bashrc 文件中对应的conda init部分

在这里插入图片描述

注释掉这部分即可。

第二部:新开一个终端,输入which python和which python3,检查python的程序是否链接到了系统python。

如果显示是系统python,那么就按照情况一处理,如果还是conda的python,那么继续往下。

执行

ls /usr/bin/python*

# 将python3链接到python3.8,1 代表优先级
# 选择一个想使用的python版本,我用的是python3.8
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

sudo update-alternatives --config python3

sudo update-alternatives --set python3 /usr/bin/python3.8

然后重启终端,这时候再执行which python,就会显示系统的python路径,直接在终端敲python,进入的是系统的python。

我们把ros的自动初始化指令放到 .bashrc 中,默认激活ros的环境,这时候ros的环境已经没有问题了。我们下面要做的就是添加conda的手动激活指令,在 .bashrc 中添加

alias setconda='. ~/miniconda3/bin/activate'

这里,alias是 .bashrc 提供的一个功能,给冗长的指令添加一个简短的别名,setconda可以自己随便换一个喜欢的名字,这个就是我们在终端执行,来唤醒conda环境的指令,如果用的是anaconda,要把miniconda3换成anaconda3,activate程序是conda官方提供用来激活conda工作空间的,. 的作用和source是一样的,所以这句和source ~/miniconda3/bin/activate是一样的,用.更加简单一些,注意.后面有一个空格。

然后重开一个终端。需要用到conda环境的时候,就执行一个setconda,就会激活conda的环境。

重开一个终端。
我们执行一个ros2 topic list,看看ros是否能正常工作
在这里插入图片描述
发现是没问题的。

我们看一下python路径,执行一个which python
在这里插入图片描述
发现也是系统python路径,满足ros的使用要求。

然后我们再激活一下conda的环境,我们在bashrc里面设置的激活指令是setconda,我们执行一下
在这里插入图片描述
可以看到前面的(base)标识已经开启,而且python也变为了conda的python,这样就可以正常使用conda了,我们执行个conda env list
在这里插入图片描述
也是没有问题的。

关于这部分的讨论,可以参考这个链接,这个也是我之前发在StackOverflow的,后来找到了解决办法。https://stackoverflow.com/questions/69778498/how-to-reset-the-default-python-of-ubuntu