Virtualenvs中的参考文献破碎

oxt*_*tay 205 python macos homebrew virtualenv dyld

我最近在我的Mac上安装了一堆dotfiles以及其他一些应用程序(我更改为iTerm而不是Terminal,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
Run Code Online (Sandbox Code Playgroud)

我删除了与dotfiles相关的所有文件,并将我的.bash_profile恢复到以前的状态,但问题仍然存在.有没有办法诊断问题或以一种简单的方式解决问题(例如,不需要再次创建所有的virtualenvs)?

Rya*_*kel 332

我在这里找到了问题的解决方案,所以所有的功劳都归功于作者.

要点是,当您创建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
...
Run Code Online (Sandbox Code Playgroud)

当您使用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
Run Code Online (Sandbox Code Playgroud)

解决方案是删除virtualenv中的符号链接,然后重新创建它们:

find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env
Run Code Online (Sandbox Code Playgroud)

在删除之前,最好先检查哪些链接会被删除:

find ~/.virtualenvs/my-virtual-env/ -type l
Run Code Online (Sandbox Code Playgroud)

在我看来,只删除损坏的符号链接更好.您可以使用GNU执行此操作find:

gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete
Run Code Online (Sandbox Code Playgroud)

您可以find使用Homebrew 安装GNU ,如果您还没有它:

brew install findutils
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,使用Homebrew安装的GNU程序往往以字母为前缀g.这是为了避免遮蔽findOS X附带的二进制文件.

  • 删除损坏的符号链接的另一种方法是使用标准查找:`find -L〜/ .virtualenvs / my-virtual-env / -type l | xargs rm` (3认同)
  • +1`gfind`是完美的,因为我有很多不间断的符号链接(例如,nodeenv),我不想删除 (2认同)

小智 37

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

转到你的virtualenv目录(但不要运行workon):

cd ~/.virtualenv/name_of_broken_venv
Run Code Online (Sandbox Code Playgroud)

现在删除这些文件:

rm -rf .Python bin/python* lib/python2.7/* include/python2.7
Run Code Online (Sandbox Code Playgroud)

然后重建你的venv,运行:

virtualenv .
workon name_of_broken_venv
pip freeze
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*ita 12

当我从Snow Leopard更新到Mac OS X Mavericks时发生了这种情况.我不得不事先重新安装brew.希望您使用pip为您的项目运行冻结命令.

要解决此问题,您必须更新虚拟环境指向的路径.

  • 使用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

这应该让项目保持原样.


Nat*_*ate 7

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

 pip install --upgrade virtualenv
Run Code Online (Sandbox Code Playgroud)

用Homebrew升级python之后。

对于任何安装了python之类的公式的用户,这应该是一个通用过程,该程序具有自己的软件包管理系统。当您安装brew install python,在安装pythonpipeasy_installvirtualenv等。因此,如果这些工具可以自我更新,那么最好先尝试这样做,然后再将“自制”视为问题的根源。


Wei*_*gTu 7

@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/
Run Code Online (Sandbox Code Playgroud)


rya*_*yan 6

如果这是由于brew upgrade升级了Python 引起的,并且可以降级到以前的版本,请尝试brew switch python [previous version],例如brew switch python 3.6.5从这里。


小智 5

任何使用pipelinenv的人(你应该!)都可以简单地使用这两个命令 \xe2\x80\x94 ,而无需激活 venv:

\n\n
rm -rf `pipenv --venv` # remove the broken venv\npipenv install --dev   # reinstall the venv from pipfile \n
Run Code Online (Sandbox Code Playgroud)\n