Conda & Dealing with Conflicting Python(s) in your system
How all pythons and condas can live together.
I took up a course on robotics using Robot Operating System (ROS). However, I always keep a
miniconda3 installation to handle my data science adventures and respective dependencies. To clarify, it installs
conda, a general purpose package manager - although really I only use it to install python libraries - and python 3.6.
What happens is that ROS uses the system python - i.e. python 2.7. The problem arises if you set your “python path” to default to that of
miniconda3, a procedure which is automated when you accept that the
miniconda3 installer adds the following line to your
In other words, everytime you open a shell, your system sets the python interpreter to that of
miniconda3, which is version 3.6. So everytime I ran something from ROS, it would crash running python scripts that were written in version 2.7, namely due to syntax differences on the
The solution - meet symlinks
After reading conda's documentation on the subject, I decided to test my ability to implement their suggested solution, which is to:
- create symlinks to three components of
- add these symlinks to the
miniconda3 from the
PATH, one simply has to comment out or delete the aforementioned line in the
.bashrc file, using some text editor like
nano for example.
Now that that is done, let us create symlinks. A symlink, for the purpose of this post, is like a pointer to some other executable file and will function as a command. I created a specific folder (
.symlinks) just for that.
mkdir .symlinks cd .symlinks
Now that we're in the
.symlinks folder, let's actually create symlinks.
ln -s /home/user/miniconda3/bin/conda conda ln -s /home/user/miniconda3/bin/activate activate ln -s /home/user/miniconda3/bin/deactivate deactivate
To verify that they were created, run
ls -l (list files) in the
.symlinks folder, you'll be able to see the pointers.
lrwxrwxrwx 1 user user 34 Nov 9 14:08 activate -> /home/user/miniconda3/bin/activate lrwxrwxrwx 1 user user 31 Nov 9 14:10 conda -> /home/user/miniconda3/bin/conda lrwxrwxrwx 1 user user 36 Nov 9 14:08 deactivate -> /home/user/miniconda3/bin/deactivate
At last, we add the
.symlinks folder to the path. But we want to have these symlink commands automatically available every time we open a new shell. The answer is to “add” them to the script which is run everytime a shell is opened: the
.bashrc file. So, add this line to the said file.
For the changes to take effect, you may close and reopen the terminal, but to feel like a pro without doing that move, run
Now, if you run
python --version you will get the system python back.
user@ryzen:~$ python --version Python 2.7.12
If you want to use python 3.6 from the root conda environment, do
user@ryzen:~$ source activate root (root) user@ryzen:~$ python --version Python 3.6.3 :: Anaconda, Inc.
As you can see from the
python --version bit, we're now using the 3.6 interpreter. If I want to activate the environment where I installed data science libraries I'd run
source activate ds.
Now that the newer interpreter is activated, you can run scripts that were written for that interpreter. Anyways, if you need to revert back to the system interpreter (2.7) on the current shell, then run
(root) user@ryzen:~$ source deactivate user@ryzen:~$ python --version Python 2.7.12
As you can see, we're back to 2.7. So you can run software that runs on this version with no problems, and switch back to your 3.6 antics whenever you want. 😄