Virtualenvs中的参考文献被破坏

我最近在我的Mac上安装了一些点文件以及一些其他的应用程序(我改成iTerm而不是Terminal,Sublime作为我的默认文本编辑器),但是从那以后,我所有的虚拟环境都停止工作,尽pipe它们的文件夹在.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恢复到之前的状态,但问题仍然存在。 有什么方法可以诊断问题或以简单的方式解决问题(例如,不需要重新创build所有的virtualenvs)?

我在这里find了解决问题的办法,所以所有的功劳都归功于作者。

要点是当你创build一个virtualenv时,许多符号链接被创build到安装了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中的符号链接指向不存在的path(因为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中的符号链接,然后重新创build它们:

 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 with Homebrew:

 brew install findutils 

请注意,默认情况下,安装了自制软件的GNU程序往往以字母g为前缀。 这是为了避免隐藏OS X附带的find二进制文件。

尝试了几件事之后,这对我有效:

去你的virtualenv目录(但不要运行):

 cd ~/.virtualenv/name_of_broken_venv 

现在删除这些文件:

 rm -rf .Python bin/python* lib/python2.7/* include/python2.7 

然后重build你的venv,运行:

 virtualenv . workon name_of_broken_venv pip freeze 

您现在应该再次看到已安装软件包的列表。

当我从Snow Leopard更新到Mac OS X Mavericks时发生这种情况。 我也必须事先重新安装brew。 希望你用pip运行你项目的冻结命令。

要解决,您必须更新虚拟环境指向的path。

  • 用brew安装一个python版本:

brew install python

  • 重新安装virtualenvwrapper。

pip install --upgrade virtualenvwrapper

  • 删除旧的虚拟环境:

rmvirtualenv old_project

  • 创build一个新的虚拟环境:

mkvirtualenv new_project

  • 在新的虚拟环境上工作

workon new_project

  • 使用pip来安装新项目的需求。

pip install -r requirements.txt

这应该离开以前的项目。

看来解决这个问题的正确方法是运行

  pip install --upgrade virtualenv 

在用Homebrew升级了python之后。

这应该是任何公式的安装类似python的一般程序,它有自己的软件包pipe理系统。 当你安装brew install python ,你安装了pythonpip以及easy_installvirtualenv等等。 所以,如果这些工具可以自我更新的话,最好先尝试把自制作为问题的根源。

更新版本@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/ 

接受的答案不适用于我:文件$WORKON_HOME/*/bin/python2.7不再是符号链接,它是一个成熟的可执行文件:

 $ file $WORKON_HOME/*/bin/python2.7 /Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64 ... 

唉,解决scheme是彻底删除和重新创build所有的虚拟环境。

供参考:

 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 

使用Python 2.7.10。

一个命令virtualenv path-to-env这样做的。 文件

 $ virtualenv path-to-env Overwriting path-to-env/lib/python2.7/orig-prefix.txt with new content New python executable in path-to-env/bin/python2.7 Also creating executable in path-to-env/bin/python Installing setuptools, pip, wheel...done.