虚拟环境中的无效引用
我最近在我的Mac上安装了一些配置文件(也就是dotfiles),还装了一些其他的应用程序。我把默认的终端换成了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
我已经删除了所有与这些配置文件相关的文件,并把我的.bash_profile恢复到了之前的样子,但问题还是没有解决。有没有什么简单的方法可以诊断这个问题或者解决它呢?比如说,不用重新创建所有的虚拟环境?
26 个回答
看起来,解决这个问题的正确方法是在你用 Homebrew 升级了 Python 之后运行
pip install --upgrade virtualenv
。
这应该是安装像 Python 这样的任何软件时的一般步骤,因为 Python 自带一个包管理系统。当你运行 brew install python
时,你会安装 python
、pip
、easy_install
和 virtualenv
等工具。所以,如果这些工具可以自己更新,最好先尝试更新它们,而不是直接把问题归咎于 Homebrew。
这是对 @Chris Wedgwood
的回答的更新版本,主要讲的是如何保留 site-packages
(也就是保留已安装的软件包)。
cd ~/.virtualenv/name_of_broken_venv
mv lib/python2.7/site-packages ./
rm -rf .Python bin lib include
virtualenv .
rm -rf lib/python2.7/site-packages
mv ./site-packages lib/python2.7/
这个问题发生在我从Snow Leopard更新到Mac OS X Mavericks的时候。在更新之前,我还得重新安装brew。希望你在项目中用pip运行了freeze命令。
要解决这个问题,你需要更新虚拟环境指向的路径。
- 用brew安装一个版本的python:
brew install python
- 重新安装virtualenvwrapper。
pip install --upgrade virtualenvwrapper
- 删除旧的虚拟环境:
rmvirtualenv old_project
- 创建一个新的虚拟环境:
mkvirtualenv new_project
- 进入新的虚拟环境工作。
workon new_project
- 用pip安装新项目所需的依赖。
pip install -r requirements.txt
这样做应该能让项目恢复到之前的状态。
经过尝试几种方法,这个对我有效:
首先,进入你的虚拟环境目录(但不要运行 workon 命令):
cd ~/.virtualenv/name_of_broken_venv
接下来,删除这些文件:
rm -rf .Python bin/python* lib/python2.7/* include/python2.7
然后要重新建立你的虚拟环境,运行:
virtualenv .
workon name_of_broken_venv
pip freeze
现在你应该能再次看到你安装的包的列表了。
我找到了这个问题的解决办法,所有的功劳都归于作者,具体内容可以在这里查看。
简单来说,当你创建一个虚拟环境(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
,虚拟环境中的符号链接就会指向一些已经不存在的路径(因为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
解决办法是先删除虚拟环境中的符号链接,然后再重新创建它们:
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
如果你还没有安装GNU的 find
,可以通过Homebrew来安装:
brew install findutils
注意,默认情况下,通过Homebrew安装的GNU程序通常会在前面加一个字母 g
,这样做是为了避免覆盖掉OS X自带的 find
命令。