Virtualenvs中的参考文献破碎

问题描述 投票:162回答:17

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

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

python macos virtualenv homebrew dyld
17个回答
287
投票

我找到了问题here的解决方案,所以所有的功劳归于作者。

要点是,当您创建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时,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

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

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

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

brew install findutils

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


1
投票

virtualenvwrapper说明

如接受的答案所示,根本原因可能是自制更新,这意味着您的virtualenv符号链接指向损坏的python路径 - 请参阅详细信息here

对于每个虚拟环境,您需要重新分配符号链接以指向正确的python路径(在brew cellar中)。以下是如何使用virtualenvwrapper。在这里,我正在更新名为“my-example-env”的虚拟环境。

cd ~/PYTHON_ENVS
find ./my-example-env -type l -delete
mkvirtualenv my-example-env

全部完成。


1
投票

我(MacOS用户)的问题是brew更新了Python和virtualenvs链接到已删除的旧版本。

我们可以通过检查和修复它

>> ls -al ~/.virtualenvs/<your-virtual-env>/.Python
.Python -> /usr/local/Cellar/python/<old-version>/Frameworks/Python.framework/Versions/3.7/Python
>> rm ~/.virtualenvs/<your-virtual-env>/.Python
>> ln -s  /usr/local/Cellar/python/<new-version>/Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs/<your-virtual-env>/.Python

1
投票

任何使用pipenv的人(你应该!)可以简单地使用这两个命令 - 没有激活venv:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 

0
投票

接受的答案对我不起作用:文件$WORKON_HOME/*/bin/python2.7不再是符号链接,它是一个完整的可执行文件:

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

唉,解决方案是从头开始彻底删除并重新创建所有虚拟环境。

供参考:

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

0
投票

简单地升级python3对我有用:

brew upgrade python3

0
投票

我尝试了前几种方法,但是对我来说它们没有用,它们试图让tox工作。最终起作用的是:

sudo pip install tox

即使已经安装了tox。输出终止于:

Successfully built filelock
Installing collected packages: py, pluggy, toml, filelock, tox
Successfully installed filelock-3.0.10 pluggy-0.11.0 py-1.8.0 toml-0.10.0 tox-3.9.0

0
投票

为我修复的只是卸载python3和pipenv然后重新安装它们。

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv

0
投票

由于Homebrew重新安装了python(因此破坏了符号链接)以及我之前做过的一些“sudo pip install”,我的虚拟环境破碎了。 Weizhong的提示非常有助于解决问题而无需重新安装软件包。我还必须为混合权限问题执行以下操作。

sudo chown -R my_username lib / python2.7 / site-packages


31
投票

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

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

cd ~/.virtualenv/name_of_broken_venv

现在删除这些文件:

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

然后重建你的venv,运行:

virtualenv .
workon name_of_broken_venv
pip freeze

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


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

这应该让项目保持原样。


5
投票

It appears解决这个问题的正确方法是运行

 pip install --upgrade virtualenv

用Homebrew升级python之后。

这应该是任何安装类似python的公式的一般过程,python具有自己的包管理系统。当你安装brew install python时,你安装pythonpip以及easy_installvirtualenv等等。因此,如果这些工具可以自我更新,那么在将Homebrew作为问题的根源之前,最好尝试这样做。


5
投票

如果这是由升级其Python的brew upgrade引起的,并且您可以降级到之前的版本,请尝试使用brew switch python [previous version],例如brew switch python 3.6.5From here.


4
投票

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

2
投票

如果你已经破坏了python3,请尝试使用brew upgrade python3为我修复它。


2
投票

我最近遇到了这个。上述解决方案均不适合我。似乎它实际上不是Python的问题。当我跑步的时候 aws s3 ls 我收到了以下错误: dyld: Library not loaded: @executable_path/../.Python 这意味着,库aws可执行文件指向是不存在或已损坏,因此我卸载并重新安装aws-cli按照this link的指示,它工作!


1
投票

使用Python 2.7.10。

一个命令virtualenv path-to-env做到了。 documentation

$ 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.
© www.soinside.com 2019 - 2024. All rights reserved.