Fix virtualenv symlinks after upgrading python with Homebrew and running brew cleanup
#!/usr/bin/env bash | |
# | |
# Fix virtualenv symlinks after upgrading python with Homebrew and then running | |
# `cleanup`. | |
# | |
# After upgrading Python using Homebrew and then running `brew cleanup` one can | |
# get this message while trying to run python: | |
# dyld: Library not loaded: @executable_path/../.Python | |
# Referenced from: /Users/pablo/.venv/my-app/bin/python | |
# Reason: image not found | |
# Trace/BPT trap: 5 | |
# | |
# This happens because the symlinks in the virtualenv point to paths that no | |
# longer exist. This script is intended to fix that. | |
if [[ "$1" == "" ]]; then | |
echo "usage:" | |
echo -e "\t./$(basename "$0") <VIRUTALENV-DIR>" | |
echo "example:" | |
echo -e "\t./$(basename "$0") \$HOME/.virtualenvs" | |
exit 0 | |
fi | |
VENVS_DIR="$1" | |
# check if GNU find is installed | |
if [[ ! "$(type -P gfind)" ]]; then | |
brew install findutils | |
fi | |
for entry in $(ls $VENVS_DIR | xargs -n 1 basename); do | |
venv_name=$(basename "$entry") | |
if [[ -d $VENVS_DIR/$venv_name ]]; then | |
# check if Library symlink is broken | |
if [[ "$(gfind $VENVS_DIR/$venv_name/.Python -type l -xtype l)" == "" ]]; then | |
echo "== Virtualenv [$venv_name] is ok. Path: $VENVS_DIR/$venv_name" | |
else | |
echo "== Virtualenv [$venv_name] has broken symlinks. Path: $VENVS_DIR/$venv_name" | |
echo -e "\tFixing [$venv_name]" | |
echo -e "\tRemoving old symlinks..." | |
echo -e "\tgfind $VENVS_DIR/$venv_name -type l -xtype l -delete" | |
gfind $VENVS_DIR/$venv_name -type l -xtype l -delete | |
python_symlink=$(readlink $VENVS_DIR/$venv_name/bin/python) | |
python_version=$(echo $python_symlink | sed 's/python//g') | |
echo -e "\tUpdating [$venv_name]..." | |
if [[ $python_version == 3.* ]]; then | |
echo -e "\tvirtualenv --python=$(which python3) $VENVS_DIR/$venv_name" | |
/usr/local/bin/virtualenv --python=$(which python3) $VENVS_DIR/$venv_name | |
else | |
echo -e "\tvirtualenv $VENVS_DIR/$venv_name" | |
/usr/local/bin/virtualenv $VENVS_DIR/$venv_name | |
fi | |
fi | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment