【问题标题】:Psycopg2 image not found未找到 Psycopg2 图像
【发布时间】:2013-04-30 18:06:22
【问题描述】:

尝试使用 postgres mac 应用程序设置 postgres 并遇到此错误,我无法解决。有什么想法吗?

    ImportError: dlopen(/Users/Craig/pyenv/mysite/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): Library not loaded: @executable_path/../lib/libssl.1.0.0.dylib
  Referenced from: /Applications/Postgres.app/Contents/MacOS/lib/libpq.dylib
  Reason: image not found

【问题讨论】:

    标签: python macos postgresql psycopg2


    【解决方案1】:

    你安装了 psycopg2 吗?您需要它才能将 python 与 postgresql 集成。

    【讨论】:

    • 是的,它已安装。我正在运行一个 pyenv,这可能会影响事情吗?
    【解决方案2】:

    在加载之前在你的 bash 环境中,试试这个:

    export DYLD_LIBRARY_PATH=/Library/PostgreSQL/x.y/lib
    

    ..用您系统上的版本替换“x.y”。

    ..请注意,如 KindOfGuy 所述,在您的 bash 配置文件中设置此项可能会干扰其他程序。

    ..当然,如果您不是在 bash 提示符下运行它,则必须以 pyenv 允许的任何方式设置您的环境。 ..您甚至可以编辑 pyenv 本身并将其放在顶部。

    另一种选择是将它放在一个 python 脚本中,该脚本在您尝试导入 psycopg2 之前运行:

    import os
    os.environ['DYLD_LIBRARY_PATH'] = '/Library/PostgreSQL/x.y/lib'
    

    ..再次,将“x.y”替换为 /Library/PostgreSQL 中系统上的版本。

    【讨论】:

    • 没什么...虽然我检查了那个文件夹/Library/PostgreSQL/9.2/,里面唯一的项目是一个名为“数据”的锁定文件夹。我想应该还有其他项目,对吧?
    • 从 bash 配置文件运行导出在其他地方造成了麻烦,但我将 os.environ['DYLD_LIBRARY_PATH'] = '/Library/PostgreSQL/x.y/lib' 卡在了 manage.py 中,这很有效。在所有项目中仍然需要这样做,但这将对我有所帮助,直到问题以其他方式得到解决。
    • 代表ctbailey这是 Postgres.app 9.3 版的更新路径:export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/Versions/9.3/lib:$DYLD_LIBRARY_PATH
    【解决方案3】:
    $ sudo ln -s /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/lib
    $ sudo ln -s /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/lib
    

    我在使用 Django 时遇到了这个错误。 我让它在带有 Django==1.3 的 virtualenv 上工作,但不是在 Django==1.5 上,我必须发出上面的命令。

    在 OS X El Capitan 中,您无法在不禁用系统保护的情况下进行这些链接,但如果您链接到 /usr/local/lib,则效果很好

    【讨论】:

    • 这个答案是唯一一个对我有用但没有搞砸 Mercurial 等其他系统的答案。看起来这是一个已知问题:github.com/PostgresApp/PostgresApp/issues/…
    • 对于那些使用 Heroku 的 Postgres.app 的人 -- sudo ln -s /Applications/Postgres.app/Contents/MacOS/lib/libssl.1.0.0.dylib /usr/lib sudo ln -s /Applications/Postgres.app/Contents/MacOS/lib/libcrypto.1.0.0.dylib /usr/lib
    • 我符号链接到/usr/local/lib 只是因为它感觉比/usr/lib 更安全且不太可能弄乱系统。效果也不错。
    • @JoeShaw 的评论在 OS X El Capitan 中是强制性的。否则,您将收到 ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted 错误。这是由于“无根”模式。更多信息在这里:apple.stackexchange.com/questions/196224/…
    • 可以确认sudo ln -s /Applications/Postgres.app/Contents/Versions/9.5/lib/libcrypto.1.0.0.dylib /usr/local/lib; sudo ln -s /Applications/Postgres.app/Contents/Versions/9.5/lib/libssl.1.0.0.dylib /usr/local/lib 适用于 9.5 Postgres.app
    【解决方案4】:

    在处理 Rails 上的类似问题时,我找到了一个对我有用的解决方案。将以下内容添加到您的 .bash_profile、.bash_rc 或等效文件中:

    export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/MacOS/lib:$DYLD_LIBRARY_PATH
    

    (假设您在默认位置安装了 Postgres.app)。然后重新启动终端会话并重试。

    直接导出到 DYLD_LIBRARY_PATH 可能会导致依赖它的其他应用出现严重问题,但使用回退路径可以避免这些问题。

    另请参阅:https://github.com/PostgresApp/PostgresApp/issues/109#issuecomment-18387546

    编辑:当您尝试运行 psql 时,设置 DYLD_FALLBACK_LIBRARY_PATH 似乎会导致错误。要解决此问题,您可以在 .bash_profile 中添加以下两行:

    alias psql="(. ~/.bash_profile; unset DYLD_FALLBACK_LIBRARY_PATH; psql)";
    

    这是假设您正在使用 bash 并且您的 .bash_profile 位于您的主目录中。如果不是这种情况(或者如果您使用 .bashrc 或其他环境设置而不是 .bash_profile),请将命令的 ~/.bash_profile 部分更改为环境设置脚本的路径。

    别名命令基本上会启动一个子shell,它不会影响您当前的 bash 环境。因此,当它取消设置 DYLD_FALLBACK_LIBRARY_PATH 变量时,它只是暂时的。退出 psql 后会重新设置环境变量。

    【讨论】:

    • 对 virtualenv 的小调整;我将此行添加到我的postactivateexport "DYLD_FALLBACK_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib:$DYLD_LIBRARY_PATH",安装时使用此命令:DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib pip install psycopg2
    【解决方案5】:

    这个问题花了我一上午的时间来解决。我发现http://initd.org/psycopg/articles/2010/11/11/links-about-building-psycopg-mac-os-x/ 上的讨论真的很有帮助。感谢 Jurie 的回答,我的问题(在 Mac 中)的解决方案如下:

    1. 使用 brew 安装 openssl 1.0.0:

       brew install openssl
      
    2. 使用以下命令:

      export DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/**1.0.1x**/lib
      

      1.0.1x 部分替换为您当前的版本。对我来说是 1.0.1 小时。

    希望这会有所帮助!

    编辑:一天后,我发现每次需要连接数据库时都必须输入第二个命令,所以不是永久解决这个问题。

    【讨论】:

    • 在执行命令时设置 DYLD_LIBRARY_PATH 环境变量也可以:DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/1.0.2d_1/lib/ python manage.py migrate
    • export DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/**1.0.1x**/lib 添加到您的环境激活脚本(例如~/anaconda3/envs/myenv/bin/activate)
    • 您也可以在~/.bash_profile中添加命令,每次都可以使用,无需反复输入
    • @PetrosKyriakou,这会导致 ssl 导入失败,从这个问题可以看出:groups.google.com/a/continuum.io/forum/#!topic/anaconda/…
    【解决方案6】:

    我找到了适合我的解决方案

    sudo cp /Applications/Postgres.app/Contents/Versions/9.3/lib/libssl.1.0.0.dylib /usr/lib
    sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib 
    
    sudo cp /Applications/Postgres.app/Contents/Versions/9.3/lib/libcrypto.1.0.0.dylib /usr/lib
    sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib 
    

    根据您计算机上安装 psql 的位置替换这部分“/Applications/Postgres.app/Contents/Versions/9.3/”。查找 psql 安装位置的命令:which psql

    评论更新: 在 OSX 10.11 (El Capitan) 上,您不能再将文件复制到 /usr/lib。使用 /usr/local/lib

    【讨论】:

    • 回复:@MitMehta 的解决方案:在 OSX 10.11 (El Capitan) 上,您不能再将文件复制到 /usr/lib。使用 /usr/local/lib。
    • 为什么不使用 Postgres.app 中可用的“最新”符号链接并复制到 /usr/lib 和 /usr/local/lib,例如:sudo ln -sf /Applications/Postgres.app/Contents /Versions/latest/lib/libssl.dylib {/usr/lib,/usr/local/lib}; sudo ln -sf /Applications/Postgres.app/Contents/Versions/latest/lib/libcrypto.dylib {/usr/lib,/usr/local/lib}
    【解决方案7】:

    我缺少 postgresql 客户端包,所以我用 brew 安装了它们,这为我解决了这个问题。

    brew update
    brew doctor
    brew install postgresql
    

    【讨论】:

      【解决方案8】:

      大局,问题是找不到所需的库。您可以使用 Apple 的 open source compiler toolsotoolinstall_name_tool 更改 psycopg2 查找 libssl 的位置。这些随 OS X 一起提供,手册页可通过man <command> 获得。

      更改到错误消息中提到的psycopg2 模块目录。到了那里:

      $ otool -L _psycopg.so
          ...
          @executable_path/../lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
          ...
      

      这列出了_psycopg2.so 将查找的库。您可以使用 install_name_tool 更改它的外观:

      $ install_name_tool -change @executable_path/../lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libssl.1.0.0.dylib _psycopg.so
      

      当然,您需要根据 libssl.1.0.0.dylib 的位置进行调整。我给出的示例是默认的 Homebrew 路径,但您可能从 Anaconda 和/或 PostgreSQL 应用程序包中获得它。 (brew install openssl 如果您还没有它。)您可能还需要为 libcrypto 重复。

      执行此更改可能会失败,具体取决于 _psycopg2.so 的构建方式。如果发生这种情况,您可能可以使用自定义库路径自己构建模块,但我不会深入探讨。

      与将 libssl 1.0.0 链接到 dyld 的搜索路径(通过 ln -s 或设置DYLD_* 环境变量)。 (请参阅discussionssome code 中的pair 中针对这些方法的警告。通过man dyld 了解有关dyld 的更多信息。)它的缺点是需要为psycopg2 的每个副本重复。选择你自己的冒险。

      免责声明:此答案中的大部分内容来自我在一天内拼凑起来的知识。我不是专家。

      【讨论】:

        【解决方案9】:

        由于升级 Postgres.app(从 9.3 到 9.4),我遇到了同样的错误。

        解决方案是删除 pip 缓存轮,因为它们指向 Postgres.app 版本 9.3。

        我通过这种方式找到了相应的 psycopg 轮缓存文件

        grep -r psycopg ~/.pip/cache
        

        并删除了我使用最后一个命令找到的目录。

        【讨论】:

          【解决方案10】:

          这发生在我升级 Postgresql 之后,以及在我的 virtualenv 中安装 psycopg2 之后。重新安装(重新构建)对我有用。

          pip uninstall psycopg2
          pip install psycopg2
          

          【讨论】:

          • 在 OS X El Capitan 10.11.3 上将 postgresql.app 版本 9.3 升级到 9.5 后,这对我有用。
          • 从 Postgres 9.6 升级到 12.1 后,这对我有用。谢谢!
          • 在我清理 pip 缓存 (pip cache purge) 后为我工作 - 缓存中的内置版本仍指向旧的 libssl 路径。
          【解决方案11】:

          我在 el capitan 上从 postgres.app 9.4 升级到 9.5 时遇到了这个问题。

          由于某些目录上的系统锁定,其他解决方案将无法(轻松)在 el capitan 中工作,这意味着符号链接解决方案对于大多数人来说不太容易访问/理想。

          这留下了后备变量。当前答案指向错误的目录。我猜 dylibs 目录自 2013 年以来发生了变化。

          所以,这是适合我的最新后备目录:

          export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/Versions/latest/lib:$DYLD_LIBRARY_PATH
          

          【讨论】:

          • 谢谢!与问题中类似的问题让我非常生气,但是将 Postgres 的 lib 前置到 DYLD_FALLBACK_LIBRARY_PATH 就可以了。
          【解决方案12】:

          在 Mac OS X 10.11 (El Capitan) 下,/usr/lib 对 root 用户是只读的。 你会得到一个ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted error 您需要使用/usr/local/lib 而不是/usr

          $ sudo ln -s /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/local/lib
          $ sudo ln -s /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/local/lib
          

          【讨论】:

            【解决方案13】:

            我在使用 mysql 时遇到了类似的问题。请求的库无法加载/usr/local/mysql/lib/libmysqlclient_r.16.dylib

            但是,在这个目录中,有一个更高版本的库: /usr/local/mysql/lib/libmysqlclient.20.dylib

            我正在使用 virtualenvwrapper,并尝试重新安装所有以前安装的依赖项,但无济于事。任何帮助将不胜感激。

            【讨论】:

              【解决方案14】:

              只是想分享对我有用的东西。我将 Anaconda 与 jupyter 一起使用。以下确实有效:

               DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/1.0.2k/lib  jupyter notebook
              

              但后来导致导入另一个库的问题(情节)。在玩了 pip 之后,我意识到我可能应该改用 conda,而以下似乎可以解决所有问题。

              conda install psycopg2
              

              【讨论】:

                【解决方案15】:

                对我有用的解决方案是安装带有“no-binary”选项集的 psycopg2,它告诉 psycopg2 使用系统 libssl。

                默认情况下,psycopg2 使用它自己的 libssl 版本,并且它似乎依赖于旧版本的库,在我升级后不再存在。

                有关非二进制选项的更多详细信息,请参阅psycopg2 install docs

                pip uninstall psycopg2
                pip install --no-binary :all: psycopg2
                

                【讨论】:

                  【解决方案16】:

                  尝试使用pip install psycopg2 --upgradepsycopg2 更新到最新版本,然后重试。

                  【讨论】:

                    【解决方案17】:

                    尝试查找文件或文件 libssl.1.0.0.dylib 并将它们复制到您的“/usr/local/lib/” 对我来说,起源是 '/Library/PostgreSQL/11/lib/' ,(将版本更改为您的版本) 或者,您可以将所有内容复制到“/usr/local/lib/” 转到原点并输入: sudo cp * /usr/local/lib/ 复制所有文件。 我找到了解决办法,改成解决我的https://oscarvalles.wordpress.com/2017/03/24/dlopenlibrary-not-loaded-libssl-dylib-fail-to-import-psycopg2-in-virtualenv/

                    【讨论】:

                      【解决方案18】:
                      pip install psycopg2-binary
                      

                      像魅力一样工作!

                      关于 source+wheel 分发 (pyscopg2) 与单独的二进制分发 (psycopg2-binary) 的讨论:https://www.postgresql.org/message-id/CA%2Bmi_8bd6kJHLTGkuyHSnqcgDrJ1uHgQWvXCKQFD3tPQBUa2Bw%40mail.gmail.com

                      关于发布 psycopg2-binary 的决定的解释:http://initd.org/psycopg/articles/2018/02/08/psycopg-274-released/

                      但是,有报告称 psycopg2-binary 不满足 psycopg2 依赖项。更多讨论在这里:https://github.com/psycopg/psycopg2/issues/674

                      【讨论】:

                      • 用现有答案回答较早的问题时,说明您的答案与现有答案的区别是很有用的。对于非常老的问题,指出答案是否依赖于较新版本的软件也很有用。
                      【解决方案19】:

                      改用psycopg2-binary

                      pip install psycopg2-binary
                      

                      【讨论】:

                        【解决方案20】:

                        如果您在虚拟环境中使用 python/django

                        为我工作了以下版本

                        • MacOS Catalina 10.5.2
                        • python 3.7.3
                        • Django 3.0.2
                        • psycopg2==2.8.4
                        • virtualenv 16.6.0
                        • 点 19.3.1
                        • postgres (PostgreSQL) 11.2

                        三步解决方案

                        • 删除现有的虚拟环境
                        • 再次创建新的虚拟环境
                        • 再次安装依赖项

                        【讨论】:

                          【解决方案21】:

                          我在以 postgreSQL 作为 DB 运行我的 Django 服务器时遇到了类似的问题。我通过以下步骤修复了它,我正在使用 conda 来处理虚拟环境。

                          创建一个新的虚拟环境,我将其命名为newenv

                          1 - conda create --name newenv

                          2 - conda activate newenv

                          3 - pip install -r requirements.txt

                          4 - python manage.py runserver

                          后来它就像一个魅力:)。

                          【讨论】:

                            【解决方案22】:

                            我在使用 macOS 执行 pip install psycopg2-binary 时遇到了类似的问题,这对我来说很奇怪:)

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2017-05-18
                              • 2020-11-09
                              • 1970-01-01
                              • 1970-01-01
                              • 2019-01-25
                              • 2020-10-15
                              • 2021-03-18
                              • 1970-01-01
                              相关资源
                              最近更新 更多