我最近在我的Mac上安装了一堆dotfiles和其他一些应用程序(我把Terminal换成了iTerm, Sublime作为我的默认文本编辑器),但从那以后,我所有的虚拟环境都停止了工作,尽管它们的文件夹在.virtualenvs中仍然存在,每当我试图在其中运行任何东西时,它们都会给出以下错误:
dyld: Library not loaded: @executable_path/../.Python
Referenced from: /Users/[user]/.virtualenvs/modclass/bin/python
Reason: image not found
Trace/BPT trap: 5
我已经删除了所有与dotfiles相关的文件,并将.bash_profile恢复到以前的状态,但问题仍然存在。有什么方法可以诊断问题或以一种简单的方式解决它(例如,不需要重新创建所有的virtualenv)?
我在这里找到了这个问题的解决方案,所以所有的功劳都归于作者。
要点是,当您创建virtualenv时,会创建许多到已安装的Homebrew Python的符号链接。
这里有一个例子:
$ ls -la ~/.virtualenvs/my-virtual-env
...
lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python
...
当您使用Homebrew升级Python并运行brew cleanup时,virtualenv中的符号链接指向不再存在的路径(因为Homebrew删除了它们)。
符号链接需要指向新安装的Python:
lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python
解决方案是删除virtualenv中的符号链接,然后重新创建它们:
find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env
在删除链接之前,最好先检查哪些链接将被删除:
find ~/.virtualenvs/my-virtual-env/ -type l
在我看来,只删除损坏的符号链接更好。你可以使用GNU find:
gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete
如果你还没有,你可以在Homebrew中安装GNU find:
brew install findutils
注意,默认情况下,安装Homebrew的GNU程序倾向于以字母g作为前缀。这是为了避免遮蔽OS X附带的find二进制文件。
我在这里找到了这个问题的解决方案,所以所有的功劳都归于作者。
要点是,当您创建virtualenv时,会创建许多到已安装的Homebrew Python的符号链接。
这里有一个例子:
$ ls -la ~/.virtualenvs/my-virtual-env
...
lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python
...
当您使用Homebrew升级Python并运行brew cleanup时,virtualenv中的符号链接指向不再存在的路径(因为Homebrew删除了它们)。
符号链接需要指向新安装的Python:
lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python
解决方案是删除virtualenv中的符号链接,然后重新创建它们:
find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env
在删除链接之前,最好先检查哪些链接将被删除:
find ~/.virtualenvs/my-virtual-env/ -type l
在我看来,只删除损坏的符号链接更好。你可以使用GNU find:
gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete
如果你还没有,你可以在Homebrew中安装GNU find:
brew install findutils
注意,默认情况下,安装Homebrew的GNU程序倾向于以字母g作为前缀。这是为了避免遮蔽OS X附带的find二进制文件。
接受的答案不适合我:文件$WORKON_HOME/*/bin/python2.7不再是一个符号链接,它是一个成熟的可执行文件:
$ file $WORKON_HOME/*/bin/python2.7
/Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64
...
解决方案是完全删除并从头重新创建所有虚拟环境。
供参考:
deactivate
pip install --user virtualenv virtualenvwrapper
pip install --user --upgrade virtualenv virtualenvwrapper
for ve in $(lsvirtualenv -b); do
# assume that each VE is associated with a project
# and the project has the requirements.txt file
project=$(cat $WORKON_HOME/$ve/.project)
rmvirtualenv $ve
mkvirtualenv -a $project -r requirements.txt $ve
done