Note: This post has been updated to reflect the modules on Dardel (December 2021).
When we use Python in our work or personal projects, it is often necessary to use a number of packages that are not distributed as standard Python libraries. We therefore need to install those packages based on the specific requirements of every project. In the scenario of working on multiple projects, it is not uncommon that different projects have conflicting requirements in terms of packages. For example, project A may require version 1.0 of a certain package, while project B may require version 2.0 of the same package. A solution to this conflict is to separate the packages for different projects or purposes with the help of a so-called “virtual environment”.
A Python virtual environment is an isolated run-time environment that makes it possible to install and execute Python packages without interfering with the outside world. Without a virtual environment, Python packages are installed either in the system site directory, which can be located via the following command:
$ python -c 'import site; print(site.getsitepackages())'
or in the so-called Python user base, which is usually in the “
$HOME/.local” folder. A Python package installed in this way can have only one version, and it is therefore not possible to work with two or more projects that have conflicting requirements regarding the versions of a certain Python package. With the help of a virtual environment, we can have different Python site directories for different projects and have those site directories isolated from each other and from the system site directory.
This blog post will briefly introduce two ways of creating and managing a Python virtual environment:
Virtual environment with venv
venv module is a standard Python module that has been available since Python 3.3. It provides a lightweight virtual environment and is very straightforward to use.
For example, if we want to use the
venv module on Dardel, we can first load the
anaconda module, and then create a virtual environment in the
home folder as follows. (Note: If you do this, you need to replace “
username” in the example with your username and “
u” with the first letter of your username.)
$ module load PDC/21.11 $ module load Anaconda3/2021.05 $ cd /cfs/klemming/home/u/username $ python3 -m venv my-venv-dardel
After the “
python3 -m venv ...” command has been executed, a new folder (named “
my-venv-dardel”) will have been created. This folder will contain the files that are used by the virtual environment, such as executables, libraries and scripts. (Note: You can use a different name for the environment, and hence the new folder. )
To use the new virtual environment, we need to activate it first as follows:
$ source my-venv-dardel/bin/activate (my-venv-dardel) $
After the “
source ...” command has been run, we will see the environment name surrounded by parentheses, which reminds us that the “
my-venv-dardel” environment is currently active.
We can now check that the Python site directory using the following commands. In the output we can see that the “
site-packages” folder is inside the “
(my-venv-dardel) $ python3 -c 'import site; print(site.getsitepackages())' ['/cfs/klemming/home/u/username/my-venv-dardel/lib/python3.8/site-packages']
We can also install any necessary packages in the now-active virtual environment. For example we can install
yapf (a formatter for Python files):
(my-venv-dardel) $ python3 -m pip install yapf
and then check that
yapf is installed under “
(my-venv-dardel) $ which yapf /cfs/klemming/home/u/username/my-venv-dardel/bin/yapf
To deactivate the virtual environment, use the “
(my-venv-dardel) $ deactivate $
After the “
deactivate” command has been run, the “
my-venv-dardel” environment will become inactive, as indicated by the disappearance of the environment name surrounded by parentheses.
Virtual environment with conda
anaconda module loaded on Dardel, it is also natural to use “
conda” to manage virtual environments for Python.
conda is an open-source package and environment manager, and is included in both Anaconda and Miniconda.
conda, we need to initialize it first. This is often done by modifying the
~/.bashrc script; however, the
~/.bashrc script is automatically loaded upon login, and you may not want to initialize
conda every time you log in to Dardel. In practice it is recommended to use a separate script for initializing
conda. We can create a
~/.bashrc.conda.dardel file with the contents in the example below, which can then be used to initialize
conda for Dardel.
module load PDC/21.11 module load Anaconda3/2021.05 # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/pdc/software/21.11/eb/software/Anaconda3/2021.05/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/pdc/software/21.11/eb/software/Anaconda3/2021.05/etc/profile.d/conda.sh" ]; then . "/pdc/software/21.11/eb/software/Anaconda3/2021.05/etc/profile.d/conda.sh" else export PATH="/pdc/software/21.11/eb/software/Anaconda3/2021.05/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<<
After this we can load the anaconda module and initialize
conda with the following command:
$ source ~/.bashrc.conda.dardel (base) $
After the above command has been executed, we’ll see “
base” surrounded by parentheses, indicating that the default virtual environment is active.
The next step is to configure
conda with user-defined directories. For example, we can edit the
~/.condarc file (or create the file if it doesn’t exist) so it contains the following lines.
pkgs_dirs: - /cfs/klemming/home/u/username/conda-dirs/pkgs envs_dirs: - /cfs/klemming/home/u/username/conda-dirs/envs
Now we are ready to create our own virtual environment with
conda. In practice, we use the “
conda create ...” command and specify both the “
--prefix” option and the Python version with the following command:
(base) $ conda create --prefix /cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel
Note that the “
--prefix” option should point to the virtual environment that is under the specified environment directory (
env_dirs) in the
~/.condarc file. The output will look like the following:
Collecting package metadata: done Solving environment: done ## Package Plan ## environment location: /cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel added / updated specs: - python=3.8 The following packages will be downloaded: ... The following NEW packages will be INSTALLED: ... Proceed ([y]/n)?
After pressing “y” and the enter key, we’ll see the following:
Downloading and Extracting Packages ... Preparing transaction: done Verifying transaction: done Executing transaction: done # To activate this environment, use # # $ conda activate /cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel # # To deactivate an active environment, use # # $ conda deactivate
conda, the commands to activate and deactivate a virtual environment are “
conda activate ...” and “
conda deactivate”, respectively. Since we have already specified
~/.condarc, we can activate the
my-conda-dardel environment using this command:
(base) $ conda activate my-conda-dardel (my-conda-dardel) $
We can check that the Python site directory is now under
my-conda-dardel as follows:
(my-conda-dardel) $ python3 -c 'import site; print(site.getsitepackages())' ['/cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel/lib/python3.8/site-packages']
We can also install
yapf, now using “
conda install” as in the following example (and by pressing the “y” and enter keys to proceed):
(my-conda-dardel) $ conda install yapf Collecting package metadata: done Solving environment: done ## Package Plan ## environment location: /cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel added / updated specs: - yapf The following packages will be downloaded: ... The following NEW packages will be INSTALLED: ... Proceed ([y]/n)? y Downloading and Extracting Packages ... Preparing transaction: done Verifying transaction: done Executing transaction: done
We can then check that
yapf has been installed under
my-conda-dardel using the following command:
(my-conda-dardel) $ which yapf /cfs/klemming/home/u/username/conda-dirs/envs/my-conda-dardel/bin/yapf
To deactivate the virtual environment, use the “
conda deactivate” command:
(my-conda-dardel) $ conda deactivate (base) $
After the “
conda deactivate” command has been run, the “
my-conda-dardel” environment will become inactive and the default “
base” environment will become active again. The “
conda deactivate” command can also be used to deactivate the base environment as follows:
(base) $ conda deactivate $
We have briefly introduced the creation and management of a Python virtual environment using
conda. The former is lightweight and easy-to-use while the latter is more powerful and versatile. You can find more information about them in the following links: