Virtualenvs中的参考损坏


238

我最近在Mac上安装了许多点文件以及其他一些应用程序(我改为使用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还原到以前的状态,但是问题仍然存在。是否有任何方法可以诊断问题或以简单的方式解决问题(例如,无需再次创建所有虚拟环境)?



感谢您的评论,@ unubtu。这当然是有帮助的。但是我也无法制作任何新的virtualenv。我的rmvirtualenv仍然可以运行mkvirtualenv,但是在尝试运行时,出现以下错误: -bash: /usr/local/bin/virtualenv: /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/Resour: bad interpreter: No such file or directory 因此,我的python路径似乎有问题,但是我看不到问题出在哪里,因为我可以运行python,而且看起来还不错。
oxtay 2014年

1
[更新]我可能已经找到了问题,但是我不确定,实际上我不确定如何解决。似乎所有virtualenv命令在理论上都可以正常工作,但是由于python存在问题,因此它们什么也不做。因此,真正的问题在于brew的python。而且我怀疑原因是由于python目录中的名称更改。由于某些原因,所有这些命令都在文件夹中寻找python,/usr/local/Cellar/python/2.7.6但该文件夹的名称实际上是/usr/local/Cellar/python/2.7.6_1
oxtay 2014年

由于我是新手,所以我不知道手动将名称从2.7.6_1更改为2.7.6会有多大的风险。
oxtay 2014年

您应该可以重命名2.7.6_12.7.6。如果情况变得更糟,则可以将其重命名。
unutbu 2014年

Answers:


369

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

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

find如果尚未安装GNU ,可以使用Homebrew 进行安装:

brew install findutils

请注意,默认情况下,随Homebrew一起安装的GNU程序通常以字母开头g。这是为了避免遮盖findOS X附带的二进制文件。


4
+1 gfind是完美的,因为我不想删除很多连续的符号链接(例如,nodeenv)
2Toad

3
删除损坏的符号链接的另一种方法是使用标准查找:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

我删除了整个virtualenv目录。现在我无法删除符号链接。此页面上提到的解决方案均不适用于Mac。我仍然收到相同的错误“找不到图像。中止陷阱:6”
Aseem '18

这些步骤对我而言并不奏效:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
我想补充,如果ENV是与Python 2,用参数运行它:virtualenv ~/.virtualenvs/foo -p python2,否则将使用Python 3
Bohumir Zamecnik

41

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

转到您的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

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


FWIW,在升级到El Capitan并重新安装自制软件后,我只是尝试了这种方法,所以我的软件包列表没有保留。
瑞安

1
使用pipenv,您可以删除pipenv --rm并重新创建pipenv shellpipenv install
哈里·莫雷诺

14

当我从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

这应该使项目保持以前的状态。


这是前一段时间,我相信我最终会按照这些原则做一些事情,但是由于那时我还没有运行'pip Frozen> requirements.txt',所以它并不是最有效的解决方案。学过的知识。
oxtay

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/

1
这是不完美的。帮助迁移python版本,同时保留所有软件包。如果您遵循此操作,请不要执行@Chris Wedgewood的说明。
Harish Prasanna

10

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

 pip install --upgrade virtualenv

用Homebrew升级python之后。

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


这可以解决setuptools的问题,特别是:警告:找不到setuptools的svn位置== 0.6c12dev-r88846
Robert Brisita 2014年

1
我应用了此解决方案,然后virtualenv . 在破碎的虚拟环境中运行: 然后的更新版本virtualenv重新创建了必要的依赖关系,我很高兴。这个过程比我接受的答案更加自我管理和更加强大。
christang

到2020年,这仍然是答案。
scubabuddha

7

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


4

virtualenvwrapper指令

如已接受的答案所示,根本原因可能是自制程序更新,这意味着您的virtualenv符号链接指向断开的python路径-请在此处查看详细信息。

对于每个虚拟环境,您需要重新分配符号链接以指向正确的python路径(在Brew酒窖中)。这是使用virtualenvwrapper进行操作的方法。在这里,我正在更新一个名为“ my-example-env”的虚拟环境。

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

全做完了。


4

任何使用pipenv的人(并且应该使用!)都可以简单地使用以下两个命令-无需激活venv:

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

1
您也可以pipenv --rm在env文件夹中使用,然后pipenv install --dev
Handfeger

2

如果您破坏了python3,请尝试brew upgrade python3为我修复它。


2

我最近遇到了这个问题。以上解决方案均不适合我。看来这实际上不是Python的问题。当我运行

aws s3 ls

时,出现以下错误:

dyld: Library not loaded: @executable_path/../.Python

这意味着库aws可执行文件指向的是不存在或已损坏,因此我aws-cli按照此链接的说明进行了卸载并重新安装,并且有效!


2

我(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

在具有Python3.6的系统上安装Python 3.7之后,这还可以修复断开的链接
lukik

2

我有一个类似的问题,我只是通过使用 virtualenv .


欢迎来到SO。尽管我们感谢您的回答,但如果它在其他答案的基础上提供附加价值,那会更好。在这种情况下,您的答案没有提供其他价值,因为另一个用户已经发布了该解决方案。如果以前的回答对您有所帮助,一旦您有足够的声誉
David Buck

1

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

1

由于python的Homebrew重新安装(因此损坏的符号链接)以及我之前完成的一些“ sudo pip安装”,我的虚拟环境也损坏了。Weizhong的技巧对解决问题非常有用,而无需重新安装软件包。对于混合权限问题,我还必须执行以下操作。

须藤chown -R my_username lib / python2.7 / site-packages


如果要补充其他用户的答案,则应为他们留下评论,以便他们进行编辑!不错的贡献。
弗朗西斯科·彼得斯

他的信誉点不足,无法评论答案。
泰勒·史密斯

1

Virtualenvs已损坏。有时,简单的方法是删除venv文件夹并重新创建virutalenvs。


1

如果您使用pipenv,只需pipenv --rm解决即可。



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
...

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

供参考:

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

我想这是因为该解决方案还不是过时的-我刚刚尝试过,它解决了我的问题。另外,我认为如果您没有符号链接,则不会看到此处描述的错误,因此此注释不是解决方案,而是一种分散注意力的事情-仅因为您使用的是更新版本,并不意味着每个人都知道。这就是我的猜测,为什么
票数低

@RafazZ:我希望现在会更好。但是,我想知道为什么它仍然是您的符号链接。是的,我确实得到了该错误,因为virtualenv python是与常规python库链接在一起的。
2016年

我认为默认行为仍然是创建符号链接,您需要一个--always-copy参数来覆盖它。至少我从《用户指南》中获得的信息
RafazZ 2016年

@RafazZ:我从没用过--always-copy,我有常规文件:-(
sds


0

我尝试了前几种方法,但对我而言,它们却无济于事,这些方法正试图使毒素发挥作用。最终有效的是:

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

这里所有的答案都很棒,我尝试了Ryan,Chris上面提到的几种解决方案,但无法解决问题,因此必须采取快速而肮脏的方法。

  1. rm -rf <project dir>(或者mv <project dir> <backup projct dir>如果您想保留备份)
  2. git clone <project git url>
  3. 继续!

这里没有什么新奇的东西,但是它使生活更轻松!


0

我确定我晚会晚了,但是我想说,解决这个问题比这里讨论的要简单得多。

您可以轻松地重新生成虚拟环境,而无需删除/编辑任何内容。假设您调用了损坏的环境,则env_to_fix可以执行以下操作:

mkvirtualenv env_to_fix

这将重新生成链接并修复环境,而无需将当前状态转储到某个位置并进行恢复。


0

当我在Mac上将python运行时从2指向3时,遇到了相同的问题,将别名python指向python 3路径。然后,我重新创建一个新的virtualenv并重新安装我的项目所需的那些软件包。对于我的用例,我有一个写给Google工作表的python程序。清理一些与python 2实现不同的程序包,然后一切又开始起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.