Pip and virtualenv
$ mkvirtualenv newenv ... WARNING: You are using pip version 21.1.3; however, version 21.2.4 is available. You should consider upgrading via the '/Users/nick/.ve/newenv/bin/python -m pip install --upgrade pip' command.
Ever seen that error after making a new virtual environment with virtualenvwrapper?
I have several versions of Python installed on my MacOS laptop, all of them are installed from the Python.org installer, so they all live under
Here is a simple bash script to keep your pip installations in all of your python files up to date:
#!/bin/bash # update all pip versions in Python.framework pythons=/Library/Frameworks/Python.framework/Versions/ versions=$(ls $pythons) pip="-m pip install --upgrade pip" for version in $versions; do if [[ "$version" == "Current" ]]; then continue fi cmd="$pythons$version/bin/python3 $pip" $cmd done echo "[INFO] Done"
First, we create some variables to make the command building a little easier:
pythons=/Library/Frameworks/Python.framework/Versions/ versions=$(ls $pythons) pip="-m pip install --upgrade pip"
ls $pythons, you'll see all of your python versions, for me:
$ ls /Library/Frameworks/Python.framework/Versions/ 3.10 3.7 3.8 3.9 Current
Current points to the 'current' or default python version installed.
We then loop through the versions and run the command
/Library/Frameworks/Python.framework/Versions/<python-version>/bin/python3 -m pip install --upgrade pip for each
<python-version> in the directory.
Automating pip updates with
virtualenvwrapper is an excellent and simple tool for organizing and using python virtual environments.
Once installed and configured, you can create virtual environment using:
virtualenvwrapper allows you to run commands before virtualenv activation (preactivate), after activation (postactivate), before deactivation (predeactivate), after deactivation (postdeactivate) and a number of other options (see https://virtualenvwrapper.readthedocs.io/en/latest/scripts.html).
So if we wanted to ensure that
pip was up to date (or we wanted to run another command) before activating an environment, we can edit the
If we wanted to ensure an up-to-date
pip every time we activate an environment, we could use the following:
#!/bin/bash # This hook is run before every virtualenv is activated. # argument: environment name pipcmd="python3 -m pip install --upgrade pip" cmd=$WORKON_HOME/$1/bin/$pipcmd $cmd
$1 is the name of the virtual environment, which is the first argument passed to preactivate.
Similarly, we could add this to predeactivate if we didn't want to take the
pip update startup hit.
Pip updater built in
Of course, updating pip (or something else) in a number of environments is a very common action, and of course
virtualenvwrapper has a built in tool for this, so we don't need any of the scripts we just wrote. The
virtualenvwrapper command is allvirtualenv.
allvirtualenv runs some command in all of the environments in
$WORKON_HOME. For example:
allvirtualenv pip install --upgrade pip
will iterate through all of your virtual environments and upgrade pip in each.
It is important to realize that virtual environments and the various wrappers and tools to deal with them are not magic. Most are just making symlinks and re-arranging your path. Some, like
virtualenvwrapper provide some really nice mechanisms to add arbitrary commands and customization's to your environments. The more you understand, the more productive you can be.