Virtualenvs中的破引用

我最近在我的Mac上安装了一堆dotfiles和其他一些应用程序(我把Terminal换成了iTerm, 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恢复到以前的状态,但问题仍然存在。有什么方法可以诊断问题或以一种简单的方式解决它(例如,不需要重新创建所有的virtualenv)?

118152 次浏览

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

 pip install --upgrade virtualenv

在你用Homebrew升级python之后。

对于任何安装python之类的程序的公式来说,这应该是一个通用的过程,因为python有自己的包管理系统。当你安装brew install python时,你会安装pythonpipeasy_installvirtualenv等等。因此,如果这些工具可以自我更新,最好在将Homebrew视为问题的根源之前尝试这样做。

这发生在我从雪豹更新到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

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

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

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

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

brew install findutils

注意,默认情况下,安装Homebrew的GNU程序倾向于以字母g作为前缀。这是为了避免遮蔽OS X附带的find二进制文件。

在尝试了一些事情之后,这对我来说很有效:

进入你的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

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

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

解决方案是,唉,完全删除和重新创建虚拟环境所有

供参考:

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.

如果你已经破坏了python3,只需尝试为我修复它的brew upgrade python3

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

我最近遇到了这个问题。以上的方法对我来说都没用。似乎这不是巨蟒的问题。当我运行

aws s3 ls

我得到以下错误:

dyld: Library not loaded: @executable_path/../.Python< br>
这意味着,aws可执行文件所指向的库要么不存在,要么已损坏,因此我根据这个链接的指示卸载并重新安装了aws-cli,它工作了!!< / p >

简单地升级python3对我来说很有效:

brew upgrade python3

virtualenvwrapper指令

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

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

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

全部完成。

为我解决这个问题的方法是卸载python3和pipenv,然后重新安装它们。

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

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

我尝试了最常用的几种方法,但对我来说,它们都不起作用。最终奏效的方法是:

sudo pip install 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

任何正在使用pipenv的人(你应该这样做!)都可以简单地使用这两个命令——而不需要激活venv:

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

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

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

virtualenv被破坏了。有时简单的方法是删除venv文件夹并重新创建virutalenv。

这里所有的答案都很好,我尝试了Ryan和Chris上面提到的一些解决方案,但无法解决问题,所以不得不采用快速而肮脏的方法。

  1. rm -rf <project dir>(如果你想保留备份,则为mv <project dir> <backup projct dir>)
  2. git clone <project git url>
  3. 继续前进!

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

我有一个类似的问题,我解决了它只是重建虚拟环境与virtualenv .

如果你使用pipenv,只要执行pipenv --rm就能解决问题。

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

您可以轻松地重新生成虚拟环境,而无需删除/编辑任何内容。假设你的坏环境被称为env_to_fix,你可以直接执行以下命令:

mkvirtualenv env_to_fix

这将重新生成链接并修复环境,而不需要将当前状态转储到某个地方并恢复它。

当我在mac上将python运行时从2指向3时,我遇到了同样的问题,将别名python指向python 3路径。然后,我重新创建一个新的virtualenv并重新安装我的项目所需的那些包。对于我的用例,我有一个python程序写入谷歌表。清理了一些不同于python2实现的包,事情又开始工作了。

在我的OSX Catalina上升级brew后,我也面临着同样的问题。

在尝试了很多东西之后,我发现以下是最好的和简单的解决方案。

首先,删除虚拟环境。(可选)

find myvirtualenv -type l -delete

然后重新创建一个新的virtualenv

virtualenv myvirtualenv

参考:https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/

所以有很多方法,但其中一个对我有用的是如下,因为我已经冻结了我的requirements.txt文件。

使用以下命令删除旧的虚拟环境 使用 deactivate cd .. rm -r old_virtual_environment < / p >

使用PIP安装virtualenv python包 使用pip install virtualenv < / p >

然后检查是否正确安装 使用virtualenv --version < / p >

跳转到项目目录 使用cd project_directory < / p >

现在在项目目录中使用以下方法创建新的虚拟环境 使用virtualenv name_of_new_virtual_environment < / p >

激活新创建的虚拟环境 使用source name_of_new_virtual_environment/bin/activate < / p >

现在使用以下命令安装所有项目依赖项 使用pip install -r requirements.txt < / p >

当你在新创建的virtualenv上遇到这个问题时,可能是你的python版本被brew安装为“unlinked”。

你可以通过运行:brew link python@3.8来修复这个问题 (但要指定特定的python版本)

你也可以运行brew doctor,它会告诉你是否有未链接的东西,以及如何修复这个问题。