【问题标题】:python pip install psycopg2 install errorpython pip install psycopg2 安装错误
【发布时间】:2012-07-17 07:17:58
【问题描述】:

我在 mac 系统上做了一个简单的pip install psycopg2。它安装得很好,但是当我尝试使用 psycopg2 时出现错误:

Reason: Incompatible library version: _psycopg.so requires version 1.0.0 or later, but libssl.0.9.8.dylib provides version 0.9.8

pip freeze 显示 psycopg2==2.4.5 恰到好处。我已经在几个 virtualenvs 上安装了 psycopg2,但这是我第一次看到这样的错误。我尝试卸载并重新安装,结果相同。请帮忙

【问题讨论】:

  • 更新你的 dist。你需要更新鲜的libssl
  • libssl 默认由 postgres 安装。我正在使用 9.1
  • otool -L 说什么?

标签: python postgresql pip


【解决方案1】:

为我工作:

env LDFLAGS='-L/usr/local/lib -L/usr/local/opt/openssl/lib
-L/usr/local/opt/readline/lib' pip install psycopg2

来源:Can't install psycopg2 with pip in virtualenv on Mac OS X 10.7

【讨论】:

  • LDFLAGS='-L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib' pip install psycopg2 解决了我的问题.谢谢
  • 为我工作。谢谢!
  • 也为我工作,尽管我在运行它之前使用 brew 安装了 postgresql@9.5。谢谢:)
【解决方案2】:

我在我的 Mac OS High Sierra 上遇到了类似的问题。

ImportError: dlopen(/Users/chicha/Projects/CTMR/sample_registration/romans_env/lib/python3.7/site-packages/psycopg2/_psycopg.cpython-37m-darwin.so, 2): 库未加载:/ opt/local/lib/libssl.1.0.0.dylib

但是在“pip install postgres”之后它工作正常。 根据 pip show -“postgres 是对 psycopg2 的高价值抽象”。 安装时还安装了 psycopg2-binary 和 psycopg2-pool。 所以,他们一起以某种方式修复了这种情况。

【讨论】:

    【解决方案3】:

    在 OSX 10.11 上,El Capitan 报告了带有替换符号链接的解决方案 Operation not permitted。对我有用的解决方案是使用 brew 并设置 DYLD_LIBRARY_PATH。所以:

    brew install openssl
    

    查找 openssl brew 库所在的位置(brew --prefix openssl 可以帮助),从目录 /usr/local/Cellar/openssl 开始搜索。就我而言,它位于/usr/local/Cellar/openssl/1.0.2d_1/lib

    最后设置 DYLD_LIBRARY_PATH,即在 .bash_profile 中添加这样一行:

    # replace location of lib files with folder name you found in previous step
    export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/Cellar/openssl/1.0.2d_1/lib
    

    更新:更通用/更好的选择是(感谢@dfrankow):

    • 使用 brew 查找 openssl 位置(注意,brew 可能很慢):DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(brew --prefix openssl)/lib
    • 出于开发目的,使用DYLD_FALLBACK_LIBRARY_PATH 可能会更好 - 检查this

    重启shell,或者只是source ~/.bash_profile,重新安装psycopg2:

    pip uninstall psycopg2
    pip install psycopg2
    

    并测试它是否有效:

    $ python -c"import psycopg2  ;   print('psycopg2 is now ok')"
    

    【讨论】:

    • 来自stackoverflow.com/a/33032963/34935:您也可以尝试更通用的:export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(brew --prefix openssl)/lib。而且,您也可以改用DYLD_FALLBACK_LIBRARY_PATH,以免干扰DYLD_LIBRARY_PATH
    • LDFLAGS="-L$(brew --prefix openssl)/lib" pip install psycopg2
    【解决方案4】:

    如果您不习惯将库复制到系统目录中,可以使用 DYLD_LIBRARY_PATH 环境变量强制操作系统在 Postgres 的库目录中搜索 libssl。例如:

    $ DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib pip install psycopg2
    

    (记录在dyld 手册页下)。

    【讨论】:

      【解决方案5】:

      对于 Mavericks 的我来说,只需复制两个 dylib 并重新启动 Python:

      cp /Library/PostgreSQL/9.3/lib/libssl.1.0.0.dylib /usr/lib/
      cp /Library/PostgreSQL/9.3/lib/libcrypto.1.0.0.dylib /usr/lib/
      

      【讨论】:

        【解决方案6】:

        这里接受的答案是正确的(除了我认为它必须是 ln -fs ,事实上我认为如果不是(?),它甚至可能会破坏你的操作系统)。在碰到这个并处理它之后,我只想收集这个问题的完整解决方案和另一个 lib 问题(libcrypto.1.0.0.dylib),你将在 Mountain Lion 和 Snow Leopard 上遇到 Postgres 9.*,并且也许其他系统。这也阻止了我运行 psql,它抱怨相同的两个库。

        /usr/lib 中基本上需要两个更高版本的库,libssl 和 libcrypto。您可以在 Postgres lib 目录中找到这些库所需的版本。

        • 如果您是 OSX 并安装了 Postgres 的 Enterprise DB 版本,则该文件将位于 /Library/PostgreSQL/9.2/lib
        • 对于其他安装类型的 Postgres,请在 Postgress 安装目录中查找 lib 目录,例如,对于 Postgress.app,请在 /Applications/Postgres.app/Contents/MacOS/lib 中找到 lib 目录,
        • /usr/local/Cellar 某处酿造,
        • 在 *nix 上,无论您安装在哪里。但是,如果您的发行版仅通过包管理器有更高版本,请先查看 *nix。

        首先将这两个库中最新的从 Postgres lib 目录复制到/usr/lib

        sudo cp /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/lib
        sudo cp /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/lib
        

        然后更新(或创建)此库的 /usr/lib 符号链接。无论哪种方式,命令都是ln -fs

        sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
        sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib
        

        应该修复。很确定 ln -fs 比删除符号链接并重新制作它更好,因此 libssl 在不存在时被需要它的东西找不到的可能性较小(它做同样的事情;它首先删除符号链接,如果它是已经在那里了,只是比你输入它的速度还快)。总是小心在 /usr/lib 上胡闹。

        【讨论】:

        • +1 @purrell。在提出这个问题时,周围没有太多可用的解决方案,所以我在 SO 上碰到了它。尽管不幸的是人们遇到了同样的麻烦,但很高兴看到他们分享他们的解决方案。感谢您的详细解释。会帮助很多人。干杯!
        • 谢谢,这对我有用。但是我不明白的是,为什么一周前我在另一个 virtualenv 中使用完全相同的包版本没有这个问题(这也是 OP 所建议的)?
        • 这也适用于 OS X 10.9 (Mavericks)。谢谢!
        • 这对我来说似乎完全破坏了 Chrome。 (谷歌浏览器 v35.0.1916.153,Mac OS X 10.7.5)Dyld Error Message: Library not loaded: /usr/lib/libcrypto.0.9.8.dylib, Reason: no suitable image found. Did find: /usr/lib/libcrypto.0.9.8.dylib: mach-o, but wrong architecture。 Safari 也无法加载 https 并出现错误:com.apple.mdworker: /usr/lib/libcrypto.0.9.8.dylib: mach-o, but wrong architecture
        【解决方案7】:

        对我来说,libcryto 和 libss 版本 1.0.0 位于以下位置:

        /Library/PostgreSQL/9.1/lib/libcrypto.1.0.0.dylib
        /Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib
        

        所以解决我的问题的命令是:

        sudo ln -fs /Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
        sudo ln -fs /Library/PostgreSQL/9.1/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib
        

        【讨论】:

          【解决方案8】:

          升级到 Mountain Lion 后我遇到了类似的问题。

          不要按照 Slack 的建议复制 libssl.* 文件,而是确保 /usr/lib/libssl.dylib 实际上是指向最新版本库的软链接。

          例如,在我的机器上,ls -l /usr/lib/libssl* 给出:

          lrwxr-xr-x  1 root  wheel    46B Jun 27 15:24 /usr/lib/libssl.1.0.0.dylib -> /Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib
          lrwxr-xr-x  1 root  wheel    27B Jul 30 10:31 /usr/lib/libssl.dylib -> /usr/lib/libssl.1.0.0.dylib
          

          如果libssl.dylib 没有链接到错误版本提到的版本,请确保您拥有该版本的库,然后确保/usr/lib/libssl.dylib 指向它,而不是旧版本。

          如果链接不存在,就这样创建

          sudo ln -s library_to_link_to link_to_create
          

          当然,为您的机器使用适当的位置。对我来说,结果是:

          sudo ln -s /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
          

          编辑

          似乎有些人对我的部分解决方案有问题。也就是说,删除这些重要的库即使是暂时的也会导致操作系统出现问题。

          根据Purrell's answer,请确保在使用ln 命令时包含-fs 标志,这有助于确保库不会在短时间内丢失。例如,

          sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
          sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib
          

          【讨论】:

          • 工作正常,警告在弄乱这些文件时要小心,我犯了一个错误,破坏了整个操作系统。
          • @bosco 是的,同样的事情也发生在我身上。我就在这个线程上,并且搞砸了操作系统(雪豹,用山狮升级 USB 修复)。对于阅读本文的其他人,我相信您需要 ln -fs ... 不要先删除符号链接。我不完全明白为什么会发生这种情况。我想某些进程在被删除时可能会使用该库?也许删除和重新链接库是轮盘赌。如果有人知道更多,请解释。
          【解决方案9】:

          当尝试执行 syncdb Postgres 9.1 和 /psycopg2/_psycopg.so 时,又添加了一个错误:

          库未加载:@loader_path/../lib/libcrypto.dylib 引用自:/usr/lib/libpq.5.dylib 原因:库版本不兼容:libpq.5.dylib需要1.0.0或更高版本,但libcrypto.0.9.8.dylib提供0.9.8版本

          通过复制以下六 (6) 个文件来解决:

          LOCAL:/Library/PostgreSQL/9.1/lib/

          libssl.1.0.0.dylib

          libssl.a

          libssl.dylib

          libcrypto.1.0.0.dylib

          libcrypto.a

          libcrypto.dylib

          到:本地:/usr/lib

          这是在 Mac OSx 10.8.1 上,带有 virtualenv (1.8.2) 和 pgAdmin (1.14.3) 中的 web。 virtualenv里面是:

          Django==1.4

          psycopg2==2.4.5

          ... 等等... 现在恢复正常。

          【讨论】:

            【解决方案10】:

            我的朋友,只需将 libssl.* 文件从 PostgreSQL lib 目录复制到 /usr/lib 并在这种情况下重新启动您的应用程序,一切都会完美的^_^

            【讨论】:

            • 这对我有用,谢谢!作为参考,在 OSX 10.8 上,Slack 引用的 PostgreSQL 库目录是 /Library/PostgreSQL/9.1/lib/
            • 这其实解决不了。符号链接也需要更改。
            猜你喜欢
            • 2018-09-23
            • 2017-12-03
            • 2019-10-11
            • 2016-04-07
            • 2013-04-01
            • 2013-06-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多