虚拟环境中的无效引用

251 投票
26 回答
122445 浏览
提问于 2025-04-18 03:51

我最近在我的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 个回答

11

看起来,解决这个问题的正确方法是在你用 Homebrew 升级了 Python 之后运行

 pip install --upgrade virtualenv

这应该是安装像 Python 这样的任何软件时的一般步骤,因为 Python 自带一个包管理系统。当你运行 brew install python 时,你会安装 pythonpipeasy_installvirtualenv 等工具。所以,如果这些工具可以自己更新,最好先尝试更新它们,而不是直接把问题归咎于 Homebrew。

13

这是对 @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/
16

这个问题发生在我从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

这样做应该能让项目恢复到之前的状态。

44

经过尝试几种方法,这个对我有效:

首先,进入你的虚拟环境目录(但不要运行 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

现在你应该能再次看到你安装的包的列表了。

388

我找到了这个问题的解决办法,所有的功劳都归于作者,具体内容可以在这里查看。

简单来说,当你创建一个虚拟环境(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 命令。

撰写回答