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
,你安装了python
和pip
以及easy_install
和virtualenv
等等。 所以,如果这些工具可以自我更新的话,最好先尝试把自制作为问题的根源。
更新版本@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.