虚拟环境中的引用损坏

251

我最近在我的 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还原为之前的状态,但问题仍然存在。有没有办法诊断问题或以简单的方式解决它(例如,不需要重新创建所有虚拟环境)?


1
可能相关:http://debugfix.com/2011/11/dyld-library-loaded-executable_path-python/ - unutbu
感谢您的评论,@unubtu。这确实很有帮助。但是我也无法创建任何新的虚拟环境。我的 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
1
[更新] 我可能已经找到了问题,但我不确定该如何解决。理论上,所有的 virtualenv 命令都可以工作,但由于 Python 存在问题,它们并没有起到任何作用。所以真正的问题在于 brew 的 Python。我怀疑原因是 Python 目录名称的更改。由于某种原因,所有这些命令都在寻找 /usr/local/Cellar/python/2.7.6 文件夹中的 Python,但实际上文件夹的名称是 /usr/local/Cellar/python/2.7.6_1 - oxtay
由于我是个新手,我不知道手动将名称从2.7.6_1更改为2.7.6会有多大的风险,也不知道会发生什么。 - oxtay
不幸的是,损坏的链接对我没有起作用。通过@oxtay的解决方案,我能够解决“错误的解释器”问题,方法是创建一个名为/usr/local/Cellar/python/2.7.6的新目录(mkdir),并将/usr/local/Cellar/python/2.7.9中的所有文件复制(cp -r)到该文件夹中。我太紧张了,不敢只是重命名文件夹! - Patrick Williams
显示剩余2条评论
26个回答

2
我最近遇到了这个问题。以上解决方案都对我无效。似乎这并不是Python的问题。当我运行以下命令时:

aws s3 ls

我得到了以下错误信息:

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

这意味着,aws可执行文件指向的库不存在或已损坏,因此我按照此链接的说明卸载并重新安装了aws-cli,然后它就正常工作了!

2
如果您遇到了Python3的问题,只需尝试brew upgrade python3就可以解决问题。

1
虚拟环境有问题。有时候,最简单的方法是删除 venv 文件夹并重新创建虚拟环境。

1
由于Homebrew重新安装了Python(因此破坏了符号链接),再加上之前进行的一些“sudo pip install”,导致我的虚拟环境出现了故障。Weizhong提供的建议非常有帮助,可以修复问题而无需重新安装包。我还需要针对混合权限问题执行以下操作:
sudo chown -R my_username lib/python2.7/site-packages

如果你要补充其他用户的答案,你应该给他们留言,这样他们就可以进行编辑!很好的贡献。 - Francisco Peters
他没有足够的声望积分来评论答案。 - Tyler Smith

1
如果您使用pipenv,只需执行pipenv --rm即可解决问题。

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.

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

我猜测这个解决方案仍然有效 -- 我刚试过它并且解决了我的问题。另外,如果你没有符号链接,你就看不到这里描述的错误,所以这条评论就不是一个解决方案而是一个干扰因素 -- 仅仅因为你有一个更新版本,并不意味着每个人都有。这就是我猜测为什么会被负评的原因 :) - RafazZ
@RafazZ:我希望现在好了。但是,我想知道为什么它对你仍然是符号链接。是的,我确实会因为虚拟环境的Python链接到原始Python库而收到该错误。 - sds
我认为默认行为仍然是创建符号链接,您需要一个 --always-copy 参数来覆盖它。至少这是我从用户指南中得到的。 - RafazZ
@RafazZ:我从来没有使用过“--always-copy”,但是我有常规文件 :-( - sds

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

当您在新创建的虚拟环境中遇到此问题时,可能是由于通过brew安装的python版本未连接。

例如,您可以通过运行以下命令来解决此问题:brew link python@3.8 (但请指定您特定的python版本)

您还可以运行brew doctor,它会告诉您是否有未连接的内容以及如何解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接