Virtualenvs中的参考文献破碎

时间:2014-04-23 01:30:10

标签: python macos virtualenv homebrew dyld

我最近在我的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恢复到以前的状态,但问题仍然存在。有没有办法诊断问题或以一种简单的方式解决问题(例如,不需要再次创建所有虚拟版本)?

26 个答案:

答案 0 :(得分:276)

我找到了问题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 :(得分:30)

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

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

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

答案 2 :(得分: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

这应该让项目保持原样。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

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

 pip install --upgrade virtualenv

用Homebrew升级python之后。

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

aws s3 ls

时出现以下错误:

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

这意味着aws可执行文件指向的库不存在或已损坏,因此我按照this link的指示卸载并重新安装了aws-cli并成功了!!

答案 8 :(得分: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

答案 9 :(得分:1)

在我的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/

答案 10 :(得分:1)

如果您使用pipenv,只需执行@Lazy就可以解决问题。

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

virtualenvwrapper说明

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

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

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

全部完成。

答案 13 :(得分: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.

答案 14 :(得分:0)

对我来说,修复此问题的方法只是卸载python3和pipenv,然后重新安装它们。

mapperArrayOfJsonsToJsonOfArrays(inputArrayOfJsons: any): any {
    if (inputArrayOfJsons.length > 0) {
        let resultMap = {};
        let keys: any[] = Object.keys(inputArrayOfJsons[0]);
        keys.forEach((key: any) => {
            resultMap[key] = [];
        });

        inputArrayOfJsons.forEach((element: any) => {
            let values: any[] = Object.values(element);
            let index = 0;
            values.forEach((value: any) => {
                resultMap[keys[index]].push(value);
                index = index + 1;
            });
        });
        return resultMap;
    }
    return {};
}

答案 15 :(得分: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

答案 16 :(得分:0)

简单地升级python3对我有用:

brew upgrade python3

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

我遇到了类似的问题,我只是通过使用virtualenv .重建虚拟环境来解决了该问题

答案 21 :(得分:0)

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

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

mkvirtualenv env_to_fix

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

答案 22 :(得分:0)

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

答案 23 :(得分: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

答案 24 :(得分:0)

所以有很多方法,但是对我有用的方法如下,因为我已经冻结了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

答案 25 :(得分:0)

当您在新创建的virtualenv上遇到此问题时,可能是brew安装的python版本是“未链接的”。

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

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