Setting up and using the NEURON simulation environment and python with virtual environments
First published: February 27, 2020
Last updated: January 8, 2023
The NEURON installation adds python support using the PYTHONPATH
global environmental variable. I use virtual environments to separate my projects but the PYTHONPATH
NEURON was unfortunately adding itself to every environment I created. I want to develop projects and organize dependencies in an orderly way, so here we will remove this global environmental NEURON installation and create an isolated environment for it.
I am using the NEURON simulation environment with Python 3.7.6 and virtualenvwrapper + venv. I'll assume you know your way around a terminal and environmental variables, use virtualenvwrapper for python development, and have a working NEURON simulation environment installed on macOS (I'll do Windows in the future). If you need help setting those up, please refer to their respective pages.
macOS setup
Our goal is to isolate the NEURON python bindings so they are local to a virtual environment, rather than a global install. So in the end we will be able to access it from the environment but not from outside like this:
install NEURON using the appropriate installer from the website.
Allow the installer to add NEURON to your path and to the PYTHONPATH
. Once installation is complete, you should be able to start a python shell and import the major neuron module, h
nick ~ $ python3 -c 'from neuron import h'
This should return you to your shell prompt without any issues. So if it exits and you don't see an ImportError
, then you are all set to continue.
Setup the virtual environment
Note- I do not use the PYTHONPATH
environmental variable so I will be setting it and unsetting it without any concerns here. If you do use it, you will have to make some changes below…
On macOS, the NEURON installer defines the PYTHONPATH
environmental variable in your .bash_profile
(if you don't have a .bash_profile
it will be created). Open your .bash_profile
in your favorite text editor. For the moment, comment the line starting with export PYTHONPATH...
out. Close your terminal and open a new one. echo $PYTHONPATH
should return nothing.
Now, make a new python3 environment for your NEURON project.
nick ~ $ mkvirtualenv nrn
... # stuff printed when making environment here.
(nrn) nick ~ $
To ensure that you properly removed the PYTHONPATH before setting up this environment, you should now get an ImportError
if you try to import neuron
(nrn) nick ~ $ python3 -c "from neuron import h"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'neuron'
Since we globally unset the PYTHONPATH
variable, this will also happen if you try it from outside your environment as we did in the previous step.
Edit the virtualenvironment PYTHONPATH to use nrn locally
Virtualenvwrapper provides some utility/customization bash scripts that are run before/after activating or deactivating an environment. See the virtualenvwrapper docs for more information. We will use the postactivate
and postdeactivate
scripts (run just after activating and just after deactivating your environment, respectively) to set the PYTHONPATH
environmental variables in your isolated environment. These files are located in the nrn/bin/
(replace nrn
with whatever you named your virtualenvironment) folder wherever your WORKON_HOME
is set to (see https://virtualenvwrapper.readthedocs.io/en/latest/install.html#variable-workon-home).
I don't use the PYTHONPATH
in any other context, so I will simply set it in the postactivate
script (lives in $WORKON_HOME/<env_name>/bin/postactivate
):
#!/bin/bash # This hook is sourced after this virtualenv is activated. export PYTHONPATH="/Applications/NEURON-7.7/nrn/lib/python"
then unset it in the postdeactivate
script (lives in $WORKON_HOME/<env_name>/bin/postdeactivate
):
#!/bin/bash # This hook is sourced after this virtualenv is deactivated. export PYTHONPATH=""
You will have to replace the exact value of PYTHONPATH
with whatever NEURON added to your .bash_profile
. Now open a fresh shell and ensure the following works:
nick ~ $ echo $PYTHONPATH
nick ~ $ workon nrn
(nrn) nick ~ $ echo $PYTHONPATH
/Applications/NEURON-7.7/nrn/lib/python
(nrn) nick ~ $ deactivate
nick ~ $ echo $PYTHONPATH
And that's it! You should now be able to activate your environment and start playing with NEURON in an isolated and controlled environment!
(nrn) nick ~ $ python
Python 3.7.6 (default, Dec 30 2019, 19:38:28)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from neuron import h
>>> soma = h.Section(name='soma')
Whereas exiting your environment you won't be able to:
(nrn) nick ~ $ deactivate
nick ~ $ python3
Python 3.7.6 (default, Dec 30 2019, 19:38:28)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from neuron import h
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'neuron'
>>>
Note:
You won't be able to run nrniv
or nrngui
from your shell in the environment, Not sure why but something to be aware of.
Windows setup
I found a windows laptop so I will get this working there and post back soon (maybe).