Virtualenvs 中损坏的引用
Posted
技术标签:
【中文标题】Virtualenvs 中损坏的引用【英文标题】:Broken references in Virtualenvs 【发布时间】:2014-06-07 15:13:13 【问题描述】:我最近在我的 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 恢复为之前的状态,但问题仍然存在。有什么方法可以诊断问题或以简单的方式解决问题(例如,不需要重新创建所有虚拟环境)?
【问题讨论】:
可能相关:debugfix.com/2011/11/dyld-library-loaded-executable_path-python 感谢您的评论,@unubtu。这当然是有帮助的。但我也无法制作任何新的 virtualenvs。我的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看起来还不错。
[update] 我可能已经找到了问题,但我不确定,实际上我不确定如何解决它。现在看来,所有virtualenv
命令在理论上都可以正常工作,但是由于 python 存在问题,它们什么都不做。所以真正的问题在于brew的python。而且我怀疑原因是因为 python 目录中的名称更改。出于某种原因,所有这些命令都在文件夹 /usr/local/Cellar/python/2.7.6
中查找 python,但文件夹的名称实际上是 /usr/local/Cellar/python/2.7.6_1
。
由于我是新手,不知道手动把名字从2.7.6_1改成2.7.6有多大风险,看看会发生什么。
您应该能够将2.7.6_1
重命名为2.7.6
。如果情况变得更糟,您可以将其重命名。
【参考方案1】:
我找到了问题的解决方案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
如果您还没有 GNU find
,您可以使用 Homebrew 安装它:
brew install findutils
请注意,默认情况下,使用 Homebrew 安装的 GNU 程序倾向于以字母 g
为前缀。这是为了避免遮蔽 OS X 附带的 find
二进制文件。
【讨论】:
+1gfind
非常完美,因为我不想删除很多完整的符号链接(例如 nodeenv)
另一种删除损坏符号链接的方法是使用标准查找:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
我删除了整个 virtualenv 目录。现在我无法删除符号链接。此页面上提到的解决方案均不适用于 Mac 上的我。我仍然收到相同的错误“找不到图像。中止陷阱:6”
这些步骤对我来说不太奏效:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
只是补充一下,如果环境是使用 Python 2,则使用参数运行它:virtualenv ~/.virtualenvs/foo -p python2
,否则它将使用 Python 3。【参考方案2】:
在尝试了一些事情之后,这对我有用:
转到您的 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 并重新安装 homebrew 后尝试了这种方法,但我的包列表没有保留。 使用 pipenv,您可以通过pipenv --rm
删除并重新创建 pipenv shell
,pipenv install
如果您遇到与virtualenvwrapper.sh: There was a problem running the initialization hooks
相关的错误,您需要pip install virtualenv virtualenvwrapper
或pip3 install virtualenv virtualenvwrapper
才能让一切恢复同步。【参考方案3】:
这发生在我从 Snow Leopard 更新到 Mac OS X Mavericks 时。我也必须事先重新安装 brew 。希望您使用 pip 为您的项目运行 freeze 命令。
要解决,您必须更新虚拟环境指向的路径。
使用 brew 安装一个 python 版本:brew install python
pip install --upgrade virtualenvwrapper
rmvirtualenv old_project
mkvirtualenv new_project
workon new_project
pip install -r requirements.txt
这应该使项目保持以前的状态。
【讨论】:
这是不久前的事,我相信我最终按照这些思路做了一些事情,但由于当时我没有运行 'pip freeze > requirements.txt',所以这不是最有效的解决方案.经验教训。【参考方案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/
【讨论】:
这太完美了。帮助迁移 python 版本,同时保留所有包。如果您遵循这一点,请不要执行@Chris Wedgewood 的说明。【参考方案5】:It appears 解决此问题的正确方法是运行
pip install --upgrade virtualenv
使用 Homebrew 升级 python 之后。
这应该是任何安装诸如 python 之类的公式的通用过程,它有自己的包管理系统。当你安装brew install python
时,你安装python
和pip
和easy_install
和virtualenv
等等。因此,如果这些工具可以自我更新,最好先尝试这样做,然后再将 Homebrew 视为问题的根源。
【讨论】:
这适用于 setuptools 的问题,特别是:警告:找不到 setuptools==0.6c12dev-r88846 的 svn 位置 我应用了这个解决方案,然后在我损坏的虚拟环境中运行:virtualenv .
。 virtualenv
的更新版本然后重新创建了必要的依赖项,我很高兴。这个过程比我接受的答案更自我管理和稳健。
2020年,这依然是答案。【参考方案6】:
如果这是由升级其 Python 的brew upgrade
引起的,并且您可以降级到以前的版本,请尝试brew switch python [previous version]
,例如brew switch python 3.6.5
。 From here.
【讨论】:
【参考方案7】: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
全部完成。
【讨论】:
【参考方案8】:任何使用pipenv(你应该!)的人都可以简单地使用这两个命令——无需激活venv:
rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev # reinstall the venv from pipfile
【讨论】:
您也可以在您的环境文件夹中使用pipenv --rm
,然后使用pipenv install --dev
【参考方案9】:
如果您已经破解了 python3,请尝试为我修复它的 brew upgrade python3
。
【讨论】:
【参考方案10】:我最近遇到了这个问题。以上解决方案都不适合我。似乎这实际上不是 Python 的问题。当我运行时 aws s3 ls
我收到以下错误:dyld: Library not loaded: @executable_path/../.Python
这意味着,aws
可执行文件指向的库要么不存在,要么已损坏,因此我按照this link 的说明卸载并重新安装了aws-cli
,它工作了!!
【讨论】:
【参考方案11】:我(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
【讨论】:
在安装 Python 3.7 的系统上安装 Python3.6 后,这也可以修复断开的链接【参考方案12】:我有一个类似的问题,我通过使用virtualenv .
重建虚拟环境解决了它
【讨论】:
欢迎来到 SO。尽管我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的回答对您有帮助,您应该在有足够的reputation 时reputation【参考方案13】:使用 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.
【讨论】:
【参考方案14】:由于 Homebrew 重新安装了 python(从而破坏了符号链接)以及我之前完成的一些“sudo pip install”,我的虚拟环境损坏了。 Weizhong 的提示非常有助于解决问题,而无需重新安装软件包。对于混合权限问题,我还必须执行以下操作。
sudo chown -R my_username lib/python2.7/site-packages
【讨论】:
如果您要补充其他用户的答案,您应该为他们留下评论,以便他们进行编辑!不错的贡献。 他没有足够的声望点来评论答案。【参考方案15】:Virtualenvs 坏了。有时简单的方法是删除 venv 文件夹并重新创建 virutalenvs。
【讨论】:
【参考方案16】:如果您使用 pipenv,只需执行 pipenv --rm
即可解决问题。
【讨论】:
【参考方案17】:在我的 OSX Catalina 上升级 brew 后,我遇到了同样的问题。
在尝试了一堆东西之后,我发现以下是最好和简单的解决方案。
首先,删除虚拟环境。 (可选)
find myvirtualenv -type l -delete
然后重新创建一个新的虚拟环境
virtualenv myvirtualenv
参考:https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/
【讨论】:
【参考方案18】:接受的答案对我不起作用:文件$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:我希望现在更好。但是,我想知道为什么它仍然是您的符号链接。是的,我确实得到了这个错误,因为 virtualenv python 与股票 python 库链接。 我认为默认行为仍然是创建符号链接,您需要一个--always-copy
参数来覆盖它。至少那是我从the User Guide 得到的
@RafazZ:我从未使用过--always-copy
,而且我有常规文件:-(【参考方案19】:
简单地升级 python3 对我有用:
brew upgrade python3
【讨论】:
【参考方案20】:我尝试了前几种方法,但它们对我来说不起作用,它们试图使 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
【讨论】:
【参考方案21】:为我解决的只是卸载 python3 和 pipenv 然后重新安装它们。
brew uninstall pipenv
brew uninstall python3
brew install python3
brew install pipenv
【讨论】:
【参考方案22】:这里的所有答案都很好,我尝试了上面 Ryan、Chris 提到的几个解决方案,但无法解决问题,所以不得不采用一种快速而肮脏的方式。
rm -rf <project dir>
(或 mv <project dir> <backup projct dir>
,如果您想保留备份)
git clone <project git url>
继续前进!
这里没有什么新奇的东西,但它让生活更轻松!
【讨论】:
【参考方案23】:我确定我迟到了,但我想说这个问题的解决比这里讨论的要简单得多。
您可以轻松地重新生成虚拟环境,而无需删除/编辑任何内容。假设您的损坏环境称为env_to_fix
,您可以执行以下操作:
mkvirtualenv env_to_fix
这将重新生成链接并修复环境,而无需将当前状态转储到某处并恢复它。
【讨论】:
【参考方案24】:当我在我的 mac 上将 python 运行时间从 2 指向 3 时,我遇到了同样的问题,将别名 python 指向 python 3 路径。然后我重新创建一个新的 virtualenv 并重新安装我的项目需要的那些包。对于我的用例,我有一个 python 程序写入谷歌表。清理一些与 python 2 实现不同的包,哇啦,事情又开始了。
【讨论】:
【参考方案25】:所以有很多方法,但对我有用的一种方法如下,因为我已经冻结了我的 requirements.txt 文件。
所以使用以下命令删除旧的虚拟环境
采用
deactivate
cd ..
rm -r old_virtual_environment
使用 pip 安装 virtualenv python 包
使用pip install virtualenv
然后检查它是否安装正确
使用virtualenv --version
跳转到你的项目目录
使用cd project_directory
现在使用以下方法在项目目录中创建新的虚拟环境
使用virtualenv name_of_new_virtual_environment
现在激活新创建的虚拟环境
使用source name_of_new_virtual_environment/bin/activate
现在使用以下命令安装所有项目依赖项
使用pip install -r requirements.txt
【讨论】:
【参考方案26】:当您在新创建的 virtualenv 上遇到此问题时,可能是您通过 brew 安装的 python 版本“未链接”。
您可以通过运行来解决此问题:brew link python@3.8
(但请指定您的特定 python 版本)
你也可以运行brew doctor
,它会告诉你是否有未链接的东西以及如何解决这个问题。
【讨论】:
以上是关于Virtualenvs 中损坏的引用的主要内容,如果未能解决你的问题,请参考以下文章
virtual 函数只有在用指针或引用的方式访问,才会导致多态。
sh 在Jenkins工作中使用pyenv virtualenvs
VS Code Code Runner 不适用于 virtualenvs